Como criar uma API REST e validar dados com Fastify, Zod e Typescript
Como criar uma API REST e validar dados com Fastify, Zod e Typescript
Durante o processo de aprendizado, é comum que o desenvolvedor back-end seja introduzido apenas ao Express, mas será que essa é a única opção? Neste artigo, iremos ver alternativas para o desenvolvimento de API’s, como criar uma API REST e como podemos aumentar a produtividade e a segurança do código com Typescript e validações do Zod.
O que é uma API REST?
Simplificadamente, uma API REST é uma forma de pedir algo para um servidor por meio de um protocolo de comunicação (HTTP), executando uma função no servidor e retornando uma informação. Durante todo esse processo, podem ocorrer diversas validações e transformações para garantir que o que foi pedido seja retornado corretamente.
Por que utilizar Typescript?
O Typescript permite que você escreva o código Javascript com mais segurança, menos erros e mais facilidade de manutenção. Além disso, ele permite que você utilize o “auto complete” da sua ferramenta de programação, como o VS Code, para te ajudar a escrever o código.
Somado a isso, tanto o Fastify quanto o Zod possuem suporte a Typescript, o que facilita ainda mais o desenvolvimento.
Por que utilizar Fastify?
O Fastify é um framework que permite que você crie servidores REST, bem como uma API REST. Em comparação com o Express, a forma como se desenvolve uma API é bem parecida. Entretanto, ele é mais performático, moderno e de fácil aprendizado, contando com várias outras vantagens. Por exemplo, um ecossistema de plugins que são mantidos tanto pela comunidade quanto pela própria equipe do Fastify.
Além de ter vantagens mais avançadas, como Decorators, Encapsulation, Lifecycle, Serialization, Hooks, entre outros.
Por que utilizar Zod?
O Zod é uma biblioteca que permite que você defina regras para validar dados, gerando automaticamente os tipos para o Typescript. Utilizaremos ele para validar os dados que serão enviados para o servidor REST. Caso os dados não correspondam às regras definidas, o servidor irá retornar um erro apontando qual campo está incorreto e o que era
esperado.
Além disso, o Zod gerará automaticamente os tipos do Typescript para você, permitindo a utilização dos dados recebidos de forma mais segura.
Passo a passo para criar uma API REST com Fastify e Zod
Para este tutorial de criação de uma API REST, foram utilizadas as seguintes ferramentas:
- Node.js (v18.10.0);
- VS Code;
- Insomnia.
Instalando as dependências
Primeiro, vamos criar uma pasta chamada fastify_zod e abrir o terminal nela. Em seguida, vamos instalar as dependências necessárias para o projeto com os seguintes comandos:
1. npm init -y 2. npm i fastify zod 3. npm i -D typescript @types/node tsx
Importando as dependências
Após o primeiro passo, vamos criar um arquivo chamado server.ts e importar as dependências que instalamos anteriormente:
import Fastify from "fastify" import { z } from "zod"
Instanciando o Fastify e criando as regras de validação do objeto User
Iremos instanciar o Fastify em uma constante chamada server e criar as regras de validação do objeto User com o Zod.
Para isso, vamos criar uma constante chamada userSchema e definir as regras de validação do objeto User. Neste caso, este é um objeto com os campos name, email e password. Para cada campo, iremos definir o tipo, o tamanho
mínimo e máximo de caracteres e o formato do campo (email).
const server = Fastify() const userSchema = z.object({ name: z.string().min(3).max(50), email: z.string().email(), password: z.string().min(8).max(50) })
Simulando um banco de dados
Para simular um banco de dados, iremos criar uma constante chamada users que será um array de objetos do tipo User. Podemos aproveitar a tipagem feita pelo Zod para inferir o tipo do objeto User da seguinte forma:
type User = z.infer <typeof userSchema> const users: User[] = []
Criando a rota de criação de usuário
Agora, vamos criar a rota de criação de usuário. Para isso, vamos utilizar o método post do Fastify e passar como primeiro parâmetro a rota que será acessada e como segundo parâmetro uma função que irá receber como parâmetro o objeto request e reply.
Dentro dessa função, iremos pegar os dados enviados pelo usuário e validar se eles estão de acordo com as regras definidas anteriormente. Caso estejam, iremos adicionar o usuário no array de usuários e retornar o usuário criado.
Caso não estejam, iremos verificar se o erro é do tipo ZodError e retornar o erro para o usuário (lembrando sempre de retornar o Status Code correto).
server.post("/users", (request, reply) => { try { const user = userSchema.parse(request.body) users.push(user) return user } catch (error) { const errorJson = JSON.stringify(error) if (error instanceof z.ZodError) return reply.status(400).send(errorJson) else return reply.status(500).send(errorJson) } })
Criando a rota de listagem de usuários
Semelhante ao passo anterior, criaremos a rota de listagem de usuários utilizando o método get e retornaremos o array de usuários.
server.get("/users", () => users)
Configurando a inicialização do servidor
Por fim, vamos iniciar o servidor utilizando o método listen do Fastify e passando como parâmetro um objeto com a porta que o servidor irá funcionar e uma função anônima que será executada quando o servidor estiver pronto para receber requisições.
server.listen({ port: 3000 }, (err, address) => { if (err) { console.error(err) process.exit(1) } console.log(`Server listening at ${address}`) })
Inicializando o servidor
Após verificar que o código está correto, basta executar o comando npx tsx ./server.ts no terminal para executar o código. O servidor irá iniciar na porta 3000 e enviará uma mensagem no terminal informando que está pronto para receber requisições.
Testando a API
Para testar a API, vamos utilizar o Insomnia (ou qualquer outra ferramenta de sua preferência). Primeiro, vamos criar um novo usuário com uma requisição do tipo POST para a rota http://localhost:3000/users e passar como corpo da requisição um objeto JSON com os campos name, email e password.
Ao enviar a requisição, o corpo da resposta será o objeto JSON do usuário criado e o Status Code será 200.
Caso tentemos criar um usuário com um campo inválido, como o email, o corpo da resposta será o erro retornado pelo Zod e o Status Code será 400.
Para listar os usuários, basta enviar uma requisição do tipo GET para a rota http://localhost:3000/users. Dessa forma, o corpo da resposta será um array com todos os usuários criados e o Status Code será 200.
Conclusão
Neste artigo, vimos como utilizar o Fastify para criar uma API REST e utilizar o Zod para validar os dados enviados pelo usuário. Pensando em melhor ainda mais sua experiência na criação de uma API REST, confira as referências de documentação utilizadas neste artigo:
Autor: João Carlos Magalhães de Castro.