Logo

dev-resources.site

for different kinds of informations.

Gerando Documentação de API Automática com Fastify, @fastify/swagger e Zod

Published at
10/3/2024
Categories
fastify
swagger
typescript
zod
Author
lucianogmoraesjr
Categories
4 categories in total
fastify
open
swagger
open
typescript
open
zod
open
Author
16 person written this
lucianogmoraesjr
open
Gerando Documentação de API Automática com Fastify, @fastify/swagger e Zod

Olá, devs! Neste post, vamos aprender como gerar documentação automática para uma API em uma aplicação Fastify utilizando as bibliotecas @fastify/swagger e Zod. Vamos dividir o tutorial em etapas para facilitar o entendimento.

O que é Fastify?

Fastify é um framework web altamente eficiente e focado em performance para Node.js. Ele oferece uma API simples e fácil de usar, com suporte para plugins e várias funcionalidades, tornando-o ideal para criar aplicações e APIs rápidas.

O que é Swagger?

Swagger é uma ferramenta popular que permite a criação de documentação interativa para APIs RESTful. Com Swagger, você pode visualizar e testar suas APIs diretamente na documentação, facilitando a vida dos desenvolvedores e consumidores da API.

Vantagens de Usar Swagger:

  • Interatividade: Permite que os desenvolvedores testem as APIs diretamente na documentação.
  • Clareza: Melhora a compreensão da API para desenvolvedores e usuários.

O que Vamos Precisar?

Este artigo requer conhecimento básico de Fastify e TypeScript.

  1. Uma aplicação Fastify configurada com TypeScript.
  2. As bibliotecas @fastify/swagger, zod e fastify-type-provider-zod.

Passo 1: Configurando o Projeto

Primeiro, vamos criar uma nova aplicação Fastify. Caso ainda não tenha um projeto, você pode criar um utilizando o seguinte comando:

npm init -y
npm install fastify
npm install -D typescript @types/node tsx
Enter fullscreen mode Exit fullscreen mode

Após a instalação, crie um arquivo tsconfig.json com o seguinte conteúdo:

{
  "$schema": "https://json.schemastore.org/tsconfig",
  "_version": "20.1.0",

  "compilerOptions": {
    "lib": ["es2023"],
    "module": "node16",
    "target": "es2022",

    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "moduleResolution": "node16"
  }
}
Enter fullscreen mode Exit fullscreen mode

Crie uma estrutura de pastas para o seu projeto:

mkdir src
touch src/server.ts
Enter fullscreen mode Exit fullscreen mode

Passo 2: Instalando as Dependências Necessárias

Agora, instale as bibliotecas necessárias para a geração da documentação:

npm install @fastify/swagger @fastify/swagger-ui fastify-type-provider-zod zod
Enter fullscreen mode Exit fullscreen mode

Passo 3: Configurando o Fastify com Swagger

Abra o arquivo src/server.ts e adicione a configuração do Fastify e do Swagger:

import fastifySwagger from "@fastify/swagger";
import fastifySwaggerUi from "@fastify/swagger-ui";
import fastify from "fastify";
import {
  jsonSchemaTransform,
  serializerCompiler,
  validatorCompiler,
  ZodTypeProvider
} from "fastify-type-provider-zod";
import z from "zod";


const app = fastify();

// Adicionar o validator e o serializer compiler
app.setValidatorCompiler(validatorCompiler);
app.setSerializerCompiler(serializerCompiler);

app.register(fastifySwagger, {
  openapi: {
    info: {
      title: 'API de Exemplo',
      description: 'Documentação da API de exemplo utilizando Fastify',
      version: '1.0.0',
    },
  },
  // Importante adicionar para fazer o parse do schema
  transform: jsonSchemaTransform
})

app.register(fastifySwaggerUi, {
  routePrefix: '/docs'
})

// Definição de um endpoint de exemplo
app.after(() => {
  app.withTypeProvider<ZodTypeProvider>().get('/hello', {
    schema: {
      response: {
        200: z.object({
          message: z.string(),
        }),
      },
    },
  }, async (request, reply) => {
    return reply.send({ message: 'Hello world!' })
  });
})

app
  .listen({ port: 3333 })
  .then(() => console.log('Server running on http://localhost:3333'))
Enter fullscreen mode Exit fullscreen mode

Passo 4: Executando a Aplicação

Agora, você pode executar a aplicação usando o tsx, adicione um script no package.json para executar:

...
"scripts": {
    "dev": "tsx watch src/server.ts"
  },
...
Enter fullscreen mode Exit fullscreen mode
npm run dev
Enter fullscreen mode Exit fullscreen mode

Ao acessar http://localhost:3000/docs, você verá a interface do Swagger UI com a documentação gerada automaticamente para o endpoint /hello.

Passo 5: Adicionando mais endpoints e schemas

Você pode facilmente adicionar mais endpoints e esquemas à sua API. Por exemplo, vamos adicionar um endpoint para calcular a soma de dois números:

// Definição do esquema para a requisição
const sumSchema = z.object({
  a: z.coerce.number(),
  b: z.coerce.number(),
});

// Endpoint para calcular a soma
app.after(() => {
  app.withTypeProvider<ZodTypeProvider>().get('/sum', {
    schema: {
      querystring: sumSchema,
      response: {
        200: z.object({
          result: z.number(),
        }),
      },
    },
  }, async (request, reply) => {
    const { a, b } = request.query
    const result = a + b;
    return { result };
  });
})
Enter fullscreen mode Exit fullscreen mode

Após adicionar o endpoint, a documentação do Swagger será atualizada automaticamente, permitindo que você visualize e teste a nova funcionalidade.

Bônus: Separando Rotas em Arquivos

Em alguns casos, você pode querer separar as rotas em arquivos distintos para manter a organização do seu código. Para isso, você pode utilizar os plugins do Fastify.

Aqui está um exemplo de como criar uma rota /sum em um arquivo separado:

Arquivo plugin.ts

import { FastifyPluginAsyncZod } from "fastify-type-provider-zod";
import z from "zod";

const sumSchema = z.object({
  a: z.coerce.number(),
  b: z.coerce.number(),
});

export const sumRoute: FastifyPluginAsyncZod = async app => {
  app.get('/sum', {
    schema: {
      querystring: sumSchema,
      response: {
        200: z.object({
          result: z.number(),
        }),
      }
    }
  }, async (request, reply) => {
    const { a, b } = request.query
    const result = a + b;
    return { result };
  })
}
Enter fullscreen mode Exit fullscreen mode

Atualizando o index.ts

Atualize o arquivo index.ts para registrar a nova rota:

import fastifySwagger from "@fastify/swagger";
import fastifySwaggerUi from "@fastify/swagger-ui";
import fastify from "fastify";
import {
  jsonSchemaTransform,
  serializerCompiler,
  validatorCompiler
} from "fastify-type-provider-zod";

import { sumRoute } from "./plugin";

const app = fastify();

app.setValidatorCompiler(validatorCompiler);
app.setSerializerCompiler(serializerCompiler);

app.register(fastifySwagger, {
  openapi: {
    info: {
      title: 'API de Exemplo',
      description: 'Documentação da API de exemplo utilizando Fastify',
      version: '1.0.0',
    },
  },
  transform: jsonSchemaTransform
})

app.register(fastifySwaggerUi, {
  routePrefix: '/docs'
})

app.register(sumRoute)

app
  .listen({ port: 3333 })
  .then(() => console.log('Server running on http://localhost:3333'))
Enter fullscreen mode Exit fullscreen mode

Conclusão

Pronto! Agora você tem uma aplicação Fastify com TypeScript capaz de gerar documentação automática utilizando @fastify/swagger e zod. Essa abordagem não apenas melhora a legibilidade da sua API, mas também facilita a vida dos desenvolvedores que a utilizam.

Espero que este tutorial tenha sido útil para você. Se tiver alguma dúvida, deixe um comentário abaixo. Até a próxima!


Gostou deste post? Siga-me para mais conteúdos sobre desenvolvimento web e tecnologias! 🚀

fastify Article's
30 articles in total
Favicon
Understanding CORS and Setting it up with NestJS + Fastify 🚀
Favicon
Building a Real-Time Auction Platform: Behind the Scenes
Favicon
Async Local Storage is Here to Help You
Favicon
Master Node.js with the 5th Edition Cookbook
Favicon
Real-time data replication in Postgres and Node.js
Favicon
NestJS vs. Ditsmod: pipe features
Favicon
NodeJS Framework which one is Fast
Favicon
Gerando Documentação de API Automática com Fastify, @fastify/swagger e Zod
Favicon
Fastify v5 vs v4 — vs Encore.ts
Favicon
nestjs vs fastify Battle
Favicon
Speeding Up Your Website Using Fastify and Redis Cache
Favicon
Streaming PostgreSQL data with Fastify
Favicon
Fastify adoption guide: Overview, examples, and alternatives
Favicon
The Essential Do's and Don'ts of Fastify: Unlocking Your API's Potential
Favicon
How to Customize the Fastify Logger
Favicon
Express.js needs a funeral
Favicon
Serve Next.js with Fastify
Favicon
Nextjs custom server with fastify
Favicon
Testing Your API with Fastify and Vitest: A Step-by-Step Guide
Favicon
Introduction to Fastify: A Superior Node.js Framework
Favicon
Fastify Developers: Upgrade Your Logging with This Simple Guide
Favicon
How to create a lan server using Node.js and Fastify.js
Favicon
Criando sua API com Fastify e Prisma
Favicon
DynamoDB Single Table Design
Favicon
Stop exposing your Node.js metrics 🛑
Favicon
Fastify Meets WireMock: External Service Mocking
Favicon
The Fastify book is out!
Favicon
How to Automatically Consume RESTful APIs in Your Frontend
Favicon
Validate the Fastify input with Joi
Favicon
Starting With Fastify Today

Featured ones: