Ir para o conteúdo principal

Validação

O ValidationPipe é um pipe interno que pode ser usado para validar dados provenientes do cliente. Ele usa o pacote class-validator debaixo do pano. O ValidationPipe fornece uma abordagem conveniente para aplicar regras de validação para todas as cargas do cliente de entrada, onde as regras específicas são declaradas com anotações simples nas declarações DTO em cada módulo.

Instalação

$ npm install class-validator class-transformer

Utilização

Agora podemos adicionar algumas regras de validação em nosso CreateUserDto. Fazemos isso usando os decoradores fornecidos pelo pacote class-validator, descrito em detalhes aqui. Desta forma, qualquer rota que usar o CreateUserDto irá automaticamente impor estas regras de validação.

src/users/dto/create-user.dto.ts
import { IsEmail, IsNotEmpty, IsOptional, IsString } from 'class-validator';
import { StringOption } from 'necord';

export class CreateUserDto {
@IsString()
@IsNotEmpty()
@StringOption({
name: 'name',
description: 'Your name',
required: true
})
public readonly name!: string;

@IsOptional()
@IsEmail()
@StringOption({
name: 'email',
description: 'Your email',
required: false
})
public readonly email?: string;
}
tip

Also you can use ValidationPipe for transforming and validating the payload of a request.

Leia mais sobre transformação

Agora, podemos usar o ValidationPipe em nossos UsersCommands para aplicar as regras de validação que acabamos de definir.

src/users/users.commands.ts
import { Injectable, ValidationPipe } from '@nestjs/common';
import { Context, Options, SlashCommand, SlashCommandContext } from 'necord';
import { CreateUserDto } from './dto/create-user.dto';

@Injectable()
export class UsersCommands {
@SlashCommand({
name: 'create',
description: 'Create a new user'
})
public async onCreateUser(
@Context() [interaction]: SlashCommandContext,
@Options(new ValidationPipe({ validateCustomDecorators: true })) createUserDto: CreateUserDto
): Promise<void> {
await interaction.reply({ content: `User created: ${createUserDto.name}` });
}
}

Now, if we try to use the create command without providing a name, or provide an invalid email, we will get an error message.

{"statusCode":400,"message":["email must be an email"],"error":"Bad Request"}

Você pode criar um snippet do decorador que valida opções:

src/decorators/validated-options.decorator.ts
import { PipeTransform, Type, ValidationPipe } from '@nestjs/common';
import { Options } from 'necord';

export const ValidatedOptions = (
...pipes: Array<PipeTransform | Type<PipeTransform>>
) => Options(...pipes, new ValidationPipe({ validateCustomDecorators: true }));
tip

You can create filters to handle and response validation errors.

Veja Filtros de Exceção para mais informações