Plugins do Fastify como blocos de construção de uma API backend em Node.js
28 de maio de 2024
0 minutos de leituraNo desenvolvimento de APIs backend em Node.js, o Fastify se destaca pelo ecossistema de plugins e pela arquitetura, oferecendo uma alternativa atraente ao framework Express tradicional. Esse framework web altamente eficiente e com baixo overhead se diferencia pela velocidade impressionante e pela simplicidade. No centro do design do Fastify está uma arquitetura robusta de plugins que aproveita ao máximo os recursos assíncronos do Node.js e estabelece um novo padrão de desempenho entre os frameworks Node.js, com os plugins do Fastify em papel fundamental.
O desenvolvimento do Fastify é impulsionado por uma comunidade open source em expansão, que mantém o framework relevante e atualizado com as últimas tendências de desenvolvimento de aplicações web. Para quem trabalha com desenvolvimento web backend em 2024, o Fastify provou ser um framework valioso para criar aplicações web rápidas, escaláveis e seguras.
Por que o Fastify e seus plugins são a base de uma API backend robusta em Node.js
Para desenvolver aplicações web modernas, o Fastify se tornou uma opção atraente entre desenvolvedores. Criado para o Node.js, esse framework web combina desempenho, flexibilidade e recursos que facilitam o trabalho de quem desenvolve. Nesta seção, vamos explorar as vantagens de usar o Fastify no desenvolvimento de aplicações modernas.
Suporte moderno a ESM
O Fastify oferece suporte nativo a módulos ECMAScript (ESM). Isso é importante porque ESM é o formato oficial dos módulos JavaScript de pacotes. Com o Fastify, você pode usar a sintaxe import e export nativamente, sem precisar de uma etapa de transpilação.
Veja um exemplo simples de servidor Fastify usando ESM:
Definição de rotas adequada com promises e async/await
O Fastify facilita o tratamento de rotas com a sintaxe async/await. O resultado é um código mais claro e legível em comparação com os padrões tradicionais de callback.
O Express não oferece suporte nativo a async/await nas definições de rotas, o que muitas vezes leva ao callback hell ou à necessidade de envolver os handlers de rota em blocos try/catch para tratar erros. Com o suporte nativo do Fastify a async/await, fica mais fácil escrever e manter código assíncrono usando promises.
Veja um exemplo de como o Fastify usa async/await na definição de uma rota:
Alto desempenho com resolução rápida de rotas por árvore radix
O Fastify foi projetado para oferecer alto desempenho. Ele conta com uma resolução rápida de rotas por árvore radix, um algoritmo de roteamento altamente eficiente. Assim, o Fastify pode lidar com muitas rotas com overhead mínimo e responder rapidamente, mesmo sob carga intensa.
Uma arquitetura rica de plugins Fastify com encapsulamento
O Fastify tem uma arquitetura rica de plugins que oferece suporte a encapsulamento. Isso permite dividir facilmente a aplicação em componentes isolados, cada um com seu próprio conjunto de rotas, plugins e decorators. Essa abordagem organiza melhor o código e reduz o risco de conflitos de nomes.
Veja um exemplo de plugin Fastify que adiciona uma função utilitária ao handler da rota:
Use este plugin da seguinte forma:
Injeção de dependências leve
O sistema de plugins do Fastify também funciona como um sistema leve de injeção de dependências (DI). Isso facilita o compartilhamento de utilitários e serviços comuns por toda a aplicação, sem recorrer a singletons ou variáveis globais.
No exemplo a seguir, uma conexão com o banco de dados é compartilhada por diferentes partes da aplicação:
Uma API backend simples em Node.js com Fastify
Este artigo apresenta os blocos fundamentais para criar APIs backend em Node.js com Fastify e seus plugins recomendados em 2024. Vamos nos aprofundar nos componentes essenciais de uma aplicação Fastify, do roteamento e middleware à validação e serialização.
Além disso, dada a importância da cibersegurança no mundo digital de hoje, vamos abordar brevemente aspectos de segurança web e como usar plugins do Fastify para tratá-los — um ponto crucial muitas vezes ignorado na pressa de desenvolver uma aplicação.
Para começar, verifique se você tem a versão LTS mais recente do Node.js instalada no sistema (na data de publicação deste artigo, é a v20.11.1). Em seguida, inicialize um novo projeto Node.js e instale o Fastify com npm, como mostrado abaixo:
Edite o arquivo package.json e adicione a definição da chave type: module no nível superior para habilitar o suporte a ESM:
Em seguida, podemos criar a estrutura básica de uma aplicação Fastify em um arquivo server.js no diretório raiz do projeto:
Encapsulando a rota da API em um plugin Fastify
O Fastify incentiva o uso de plugins para organizar o código e permitir o encapsulamento. Assim, você pode agrupar códigos relacionados e evitar conflitos entre diferentes partes da aplicação.
Vamos refatorar nossa rota "Hello World" em um plugin Fastify:
Usando schemas de requisição e resposta de rotas
O Fastify permite validar as requisições recebidas e estruturar as respostas enviadas usando JSON Schema. Isso ajuda a garantir a integridade dos dados da aplicação e simplifica a criação da documentação.
Veja como definir um schema de requisição e resposta para a rota "Hello World":
Agora, o Fastify vai validar automaticamente a resposta da rota "Hello World" com base no schema fornecido. Isso ajuda a detectar possíveis bugs e garante que a aplicação se comporte como esperado.
Plugins Fastify como blocos de construção de aplicações Fastify
Nesta seção, vamos conhecer quatro plugins importantes do Fastify: @fastify/pino, @fastify/cors, @fastify/env e @fastify/swagger, além de @fastify/swagger-ui. Ao criar uma API backend em Node.js, esses plugins ajudam a formar a base de qualquer aplicação Fastify.
O logger Pino para Fastify
Pino é um logger de desempenho excepcional para Node.js, com plugins próprios que ampliam sua integração com outros sistemas de logging, como o Sentry.
Você pode aproveitar o fato de que o Fastify usa o Pino como logger padrão. Ao inicializar o Fastify com { logger: true }, você já está usando o Pino nos bastidores. Mas, se quiser mais controle sobre o nível de logging ou outras configurações específicas do Pino, pode passar um objeto de configuração à propriedade logger.
Durante o desenvolvimento, talvez você prefira logs mais fáceis de ler e com mais cores. Para isso, podemos usar o pacote pino-pretty. Primeiro, instale pino e pino-pretty:
Em seguida, configure o pino-pretty assim:
No exemplo acima, inicializamos um logger com pino e o configuramos para usar pino-pretty como destino de transporte, com a opção colorize para habilitar logs coloridos. Depois, passamos nossa variável personalizada logger para a opção logger do Fastify.
Isso transforma os logs em um formato mais fácil de ler e entender:
Entre as vantagens de usar Pino no Fastify estão:
Logging mais rápido: o principal objetivo do Pino é ser o logger mais rápido para Node.js.
Logger versátil: oferece suporte a diferentes níveis de log e pode formatar logs como JSON.
O plugin Fastify @fastify/cors
O plugin @fastify/cors oferece uma forma simples de usar CORS (compartilhamento de recursos entre origens) na sua aplicação Fastify.
Vantagens:
Segurança: ajuda a gerenciar o fluxo de dados entre diferentes origens.
Personalização: permite definir uma função personalizada para configurar as opções de CORS.
Veja um exemplo simples de como adicionar e usar o plugin @fastify/cors:
Depois, podemos testar se a configuração do CORS está funcionando fazendo uma requisição cURL ao servidor Fastify:
A resposta deve incluir o cabeçalho Access-Control-Allow-Origin, indicando que a configuração do CORS está funcionando como esperado:
O plugin Fastify @fastify/env
É comum que desenvolvedores Node.js usem variáveis de ambiente para configurar aplicações — e, mais ainda, que recorram ao arquivo .env para gerenciá-las.
É aí que o plugin Fastify @fastify/env é útil. Você pode usar dotenv ou o --env-file integrado ao Node.js para carregar a configuração, mas este plugin permite acessar as variáveis de ambiente diretamente na aplicação Fastify, além de validar a configuração e converter tipos.
Veja um exemplo simples de como adicionar e usar o plugin @fastify/env. Comece instalando o plugin e criando um arquivo .env simples:
Em seguida, atualize o código de server.js para registrar o novo plugin Fastify:
Ao registrar o plugin Fastify @fastify/env, você acessa a configuração definida no arquivo .env pelo objeto fastify.config. Mas não podemos simplesmente usá-lo diretamente. Precisamos introduzir um novo conceito relacionado à arquitetura de plugins do Fastify.
Como a arquitetura de plugins do Fastify é assíncrona, é necessário aguardar a inicialização de todos os plugins antes que eles sejam aplicados. Isso garante que estejam registrados corretamente e prontos para uso. Se você pular essa etapa, vai receber um erro ao tentar acessar o objeto fastify.config.
Portanto, precisamos atualizar nossa nova função startServer() da seguinte forma:
Vantagens de usar o plugin @fastify/env:
Validação de variáveis de ambiente: garante que as variáveis obrigatórias estejam definidas.
Conversão de tipos: converte as variáveis de ambiente para os tipos necessários.
Injeção de dependências leve: facilita o compartilhamento da configuração por toda a aplicação onde quer que você tenha acesso à instância da aplicação
fastify.
Documente APIs backend em Node.js com os plugins Fastify @fastify/swagger e @fastify/swagger-ui
O plugin @fastify/swagger ajuda a gerar e disponibilizar uma página de documentação Swagger para sua aplicação Fastify. O @fastify/swagger-ui oferece uma interface integrada para essa documentação, acessível pelo navegador. A própria aplicação Fastify disponibiliza a página do Swagger UI.
Como antes, vamos começar adicionando esses plugins à aplicação Fastify:
Em seguida, registramos os dois plugins no arquivo server.js:
Reinicie o servidor Fastify e acesse http://localhost:3001/documentation no navegador para ver a página de documentação Swagger UI gerada. Pronto: você tem uma página de documentação Swagger totalmente funcional para sua aplicação Fastify.

Uma observação sobre segurança: em um ambiente de produção, considere proteger a página de documentação Swagger UI com autenticação e autorização. Evite também usar seus servidores Node.js de produção para disponibilizá-la.
Vantagens:
Documentação fácil de APIs: gera documentação de API automaticamente.
Personalização: permite personalizar a página de documentação.
Juntando tudo
Como vimos, o ecossistema ativo do Fastify oferece diversos plugins que podem aprimorar bastante o desenvolvimento de APIs backend em Node.js. De recursos de logging melhores com pino e pino-pretty à segurança do navegador com CORS por meio de @fastify/cors, passando pelo gerenciamento de variáveis de ambiente com @fastify/env e pela documentação da API com @fastify/swagger e @fastify/swagger-ui, essas ferramentas simplificam o fluxo de trabalho, melhoram o desempenho e elevam a qualidade das aplicações.
Em resumo, aprendemos que os plugins Fastify permitem:
Adotar o desenvolvimento modular: a arquitetura de plugins do Fastify promove o desenvolvimento modular e incentiva uma base de código organizada e fácil de manter. Ao integrar esses plugins, desenvolvedores podem se concentrar na lógica de negócios em vez de escrever código repetitivo, acelerando o desenvolvimento sem comprometer o desempenho ou a escalabilidade.
Aumente a produtividade e o desempenho: cada plugin, com seu foco específico, ajuda a resolver desafios comuns do desenvolvimento web, permitindo que você crie APIs robustas, eficientes e seguras. A integração simples com o Fastify e os benefícios oferecidos, como logs aprimorados, compartilhamento de recursos entre origens, configuração do ambiente e documentação da API, contribuem diretamente para aumentar a produtividade dos desenvolvedores e o desempenho das aplicações.
Explore ainda mais: embora tenhamos destacado alguns plugins essenciais, o ecossistema do Fastify oferece muitos outros para atender a diferentes necessidades, da autenticação à integração com bancos de dados, passando pelo controle de taxa de requisições e muito mais. Recomendamos que você explore a página de plugins do Fastify e experimente essas ferramentas para descobrir como elas podem otimizar e aprimorar ainda mais o desenvolvimento das suas APIs.
Você pode consultar o código-fonte completo de todos os exemplos acima de uma API backend em Node.js com os plugins do Fastify que abordamos.



