Curso NestJS for Azure: #3 DTO e validação de dados
No desenvolvimento de APIs robustas e escaláveis, garantir a validade e a consistência dos dados que trafegam entre cliente e servidor é fundamental. No NestJS, isso é feito de maneira eficiente através do uso de DTOs (Data Transfer Objects) e mecanismos de validação. Neste artigo, exploraremos o que são os DTOs, como eles são usados no NestJS, e duas formas poderosas de validação de dados: class-validator
e zod
.
O Que é um DTO?
DTO, ou Data Transfer Object, é um padrão de design utilizado para transferir dados entre diferentes camadas de uma aplicação. No contexto de uma API, os DTOs são usados para encapsular os dados enviados pelo cliente ao servidor (e vice-versa), garantindo que eles sejam bem definidos e tipados.
No NestJS, os DTOs são geralmente definidos como classes TypeScript, onde cada propriedade da classe representa um campo esperado no payload da requisição ou resposta. Usar DTOs ajuda a:
- Garantir Tipagem Estática: Utilizando TypeScript, você pode definir tipos explícitos para cada campo, melhorando a segurança e a previsibilidade do código.
- Facilitar a Validação de Dados: DTOs são frequentemente usados junto com bibliotecas de validação para garantir que os dados recebidos são válidos.
- Melhorar a Organização do Código: Separar a lógica de transferência de dados da lógica de negócios torna o código mais organizado e fácil de manter.
Criando um DTO no NestJS
Vamos criar um DTO básico para um recurso de usuários. Suponha que queremos criar um endpoint para criar um novo usuário, onde o payload deve conter o nome e a idade do usuário.
- Crie um arquivo
create-user.dto.ts
:
// src/users/dto/create-user.dto.ts
export class CreateUserDto {
name: string;
age: number;
}
Validação de Dados com class-validator
A biblioteca class-validator
é uma escolha popular para validação de dados em aplicativos NestJS. Ela permite definir regras de validação diretamente nas classes DTO usando decoradores.
Instalando class-validator
e class-transformer
Primeiro, instale as dependências necessárias:
npm install class-validator class-transformer
Definindo Validações no DTO
Atualize o arquivo create-user.dto.ts
para incluir regras de validação:
import { IsString, IsInt, Min, Max } from 'class-validator';
/**
* DTO para criação de um usuário.
* Utiliza class-validator para validação dos dados.
*/
export class CreateUserDto {
/**
* Nome do usuário.
* Deve ser uma string.
*/
@IsString()
name: string;
/**
* Idade do usuário.
* Deve ser um número inteiro entre 1 e 120.
*/
@IsInt()
@Min(1)
@Max(120)
age: number;
}
Usando o DTO no Controller
Vamos agora usar o CreateUserDto
no controller para validar a entrada dos dados:
import { Controller, Post, Body } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
import { validateOrReject } from 'class-validator';
/**
* Controlador para operações relacionadas a usuários.
*/
@Controller('users')
export class UsersController {
/**
* Endpoint para criação de um novo usuário.
* @param createUserDto - DTO contendo os dados do usuário a ser criado.
* @returns Mensagem de sucesso.
*/
@Post()
async create(@Body() createUserDto: CreateUserDto) {
// Validações dentro no código caso precise
await validateOrReject(createUserDto);
// Lógica para criar um novo usuário
return 'Usuário criado com sucesso';
}
}
Validação de Dados com zod
O zod
é uma biblioteca de validação de esquemas que oferece uma abordagem funcional para validação e análise de tipos. É uma alternativa ao class-validator
que pode ser mais flexível em alguns cenários.
Instalando zod
Primeiro, instale a dependência necessária:
npm install zod
Definindo um Esquema Zod
Crie um arquivo create-user.schema.ts
para definir o esquema de validação:
import { z } from 'zod';
/**
* Esquema Zod para validação dos dados de criação de um usuário.
*/
export const createUserSchema = z.object({
name: z.string().nonempty("O nome não pode estar vazio"),
age: z.number().min(1, "A idade deve ser no mínimo 1").max(120, "A idade deve ser no máximo 120"),
});
/**
* Tipo inferido a partir do esquema Zod.
*/
export type CreateUserDto = z.infer<typeof createUserSchema>;
Usando o Esquema Zod no Controller
Atualize o controller para usar o esquema Zod para validação:
import { Controller, Post, Body, BadRequestException } from '@nestjs/common';
import { createUserSchema, CreateUserDto } from './dto/create-user.schema';
/**
* Controlador para operações relacionadas a usuários.
*/
@Controller('users')
export class UsersController {
/**
* Endpoint para criação de um novo usuário.
* @param createUserDto - DTO contendo os dados do usuário a ser criado.
* @returns Mensagem de sucesso.
*/
@Post()
create(@Body() createUserDto: CreateUserDto) {
// Validações dentro no código caso precise
const parsedBody = createUserSchema.safeParse(createUserDto);
if (!parsedBody.success) {
throw new BadRequestException(parsedBody.error.errors);
}
// Lógica para criar um novo usuário
return 'Usuário criado com sucesso';
}
}
Comparação entre class-validator
e zod
Ambas as bibliotecas têm suas vantagens e desvantagens:
class-validator:
- Prós: Integração direta com classes TypeScript, uso extensivo de decoradores, fácil de usar com DTOs.
- Contras: Pode ser menos flexível em cenários complexos de validação, depende de decoradores.
zod:
- Prós: Abordagem funcional, altamente flexível, suporta validações complexas e encadeamento de métodos.
- Contras: Requer uma etapa extra para a validação e conversão de tipos.
Conclusão
Neste artigo, exploramos o conceito de DTOs no NestJS e como eles são usados para encapsular e validar dados. Também discutimos duas formas populares de validação de dados: class-validator
e zod
. Ambos os métodos têm suas próprias vantagens e podem ser escolhidos com base nas necessidades específicas do seu projeto. Com uma compreensão sólida de DTOs e validação de dados, você está bem equipado para construir APIs seguras e robustas com NestJS.