Após poucos anos, estou palestrando na primeira conferência de Node.js do Brasil e com mais de 90 repositórios no GitHub, sendo a maioria para usar com Node.js. Mudança Da noite pro dia fui chamado para vir para São Paulo trabalhar pela primeira vez em uma empresa. Começo Sem saber o que me esperava no futuro, comecei a estudar Node.js.
que dure por vários anos. Você precisa ter controle total de toda a estrutura de arquivos da sua aplicação. As soluções atuais limitam o crescimento e manutenção da sua aplicação.
definir o futuro do seu produto. Você pode definir tudo voltado para as necessidades da sua aplicação. Está menos exposto a mudanças de arquitetura e compatibilidade de versões.
fazer você e sua equipe perder muito tempo e dinheiro no futuro. Quase nunca reescrever uma aplicação em produção é viável para a maioria das empresas, e mesmo se for, você vai precisar parar boa parte ou toda a sua equipe e contratar mais pessoas para cuidar das demandas recorrentes. Estrutura É preciso tomar muito cuidado ao iniciar uma arquitetura própria. Escolhas erradas podem prejudicar muito a sua aplicação conforme ela for crescendo. equipe Decisões erradas podem influenciar muito na sua equipe, principalmente decisões estruturais. É preciso tomar muito cuidado pois essas decisões podem fazer desenvolvedores ficarem desapontados com a aplicação e sem confiança de trabalhar com ela, fazendo você perder a oportunidade de trabalhar com grandes desenvolvedores.
que é uma responsabilidade muito grande criar uma API realmente escalável e manutenível, que possa operar em produção por vários anos, sem limitar o crescimento do produto ou diminuir a produtividade da equipe. Para isso, vamos definir um percurso da nossa trajetória criando essa nova arquitetura. ambiente estrutura arquitetura
de forma idempotente. Podendo ser usado por várias formas de transmissão sem alterar a assinatura dos métodos e podendo ser usado em mais de um Endpoint. 20
de um recurso dependendo do contexto atual do usuário e dos níveis de acesso daquele recurso. Permitindo atualizar certas propriedades privadas com segurança. 27
todos os erros gerados pela aplicação, permitindo o tratamento de erros de uma forma segura e concisa. Uma das vantagens é que a aplicação só vai exibir para o usuário erros específicos e definidos pela aplicação, em vez de erros genéricos gerados internamente. 30
Tudo retorna uma Promise e todos os erros que acontecerem em todos os fluxos da aplicação, desde o bootstrap até a resposta da requisição, são tratadas em apenas um lugar, tornando o código mais limpo, confiável, legível e auto-explicativo. 33
tipo de objeto para um novo objeto de um tipo diferente de conteúdo similar. 35 importância Assim como em aplicações full-stack, quando você está criando uma API, você nunca deve confiar no input do usuário, mas muitas vezes é possível contornar certos casos. Por exemplo: seu Schema aceita apenas o tipo boolean, mas o seu usuário enviou um inteiro 1. Você pode fazer uma coerção do tipo, dado que 1 também é considerado como valor booleano em algumas linguagens.
seria o mesmo que criar uma religião, sempre vai ter as mesmas regras, nada nunca pode mudar e tudo é verdade. Essa é a pior coisa que pode acontecer com uma API. A partir do momento que você tem seu primeiro cliente, você tem um compromisso de manter a compatibilidade da integração, mas muitas vezes, como a ciência, você descobre que você estava errado e que há um jeito melhor de fazer algo, você aprende com seus erros, e vai melhorar muito para os seus novos clientes. Mas você não tem versionamento, e não pode fazer nenhuma alteração para não afetar seus clientes antigos. Resultando em uma aplicação legada e de difícil manutenção.
versões da API é uma das melhores formas. Usado também pelo Stripe e Twilio. header O método mais recomendado para fazer versionamento é por HTTP HEADER. Várias empresas como Stripe usam essa forma. changelog Mantenha um histórico das mudanças que ocorreram nas versões, e também permita que usuários possam mudar de versão em suas configurações
por Header sai ganhando. É um dos melhores e mais usados métodos de autenticação nas APIs de diversos serviços famosos. 40 Bearer Auth Basic Auth Authorization: Basic username:password Authorization: Bearer token1234
abertas sendo feitas simultaneamente a sua API, evitando abusos e economizando a utilização de recursos como conexão de socket e memória. 41 Importância É de extrema importância que aplicações que recebem milhares de requisições, implemente rate limiting para evitar abusos e sobrecargas com requisições iguais sendo feitas simultaneamente. Se você não conhecia Rate Limiting, aqui está uma das melhores libs para usar com Express. npmjs.com/express- rate-limit
uma das coisas quase obrigatórias ao se criar uma API. 42 Importância O request id é uma daquelas coisas simples, mas que causa um impacto absurdo. Principalmente aplicações que recebem milhares de requisições por dia. Como cada requisição tem um X- Request-ID associado a ela, é possível pesquisar em logs para encontrar possíveis problemas relatados por usuários de forma fácil. Se você não conhecia Request ID, aqui está uma das melhores libs para usar com Express. npmjs.com/request- id
faz parte da arquitetura de uma API. Safe Ter um ambiente estável, seguro e confiável, com facilidade de monitoramento é tudo. Logging Saber o que acontece na sua aplicação, é uma das coisas mais importantes. style guide Manter uma aplicação inteira seguindo os mesmo padrões, é o segredo para manutenção rápida e ágil. security Focar em ficar protegido, e sempre monitorando vulnerabilidades em dependências. 44