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
- Yarn
- pnpm
- Bun
$ npm install class-validator class-transformer
$ yarn add class-validator class-transformer
$ pnpm add class-validator class-transformer
$ bun add 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.
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;
}
Also you can use ValidationPipe for transforming and validating the payload of a request.
Agora, podemos usar o ValidationPipe em nossos UsersCommands para aplicar as regras de validação que acabamos de definir.
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:
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 }));
You can create filters to handle and response validation errors.