Curso NestJS for Azure: #3 DTO e validação de dados

Cláudio Rapôso
4 min read1 day ago

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:

  1. 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.
  2. 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.
  3. 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.

--

--

Cláudio Rapôso

Microsoft MVP | Software Architect | Teacher | React | React Native | Node | Autor do Livro NestJS: Do Zero até a primeira API | MCT | 12x Msft | 2x AWS