Skip to main content

Validation

Le ValidationPipe est un pipe intégré qui peut être utilisé pour valider les données provenant du client. Il utilise le paquet class-validator en interne. Le ValidationPipe offre une approche pratique pour appliquer des règles de validation à toutes les charges utiles entrantes du client, où les règles spécifiques sont déclarées à l'aide de simples annotations dans les déclarations de DTO de chaque module.

Installation

$ npm install class-validator class-transformer

Utilisation

Nous pouvons maintenant ajouter quelques règles de validation dans notre CreateUserDto. Pour cela, nous utilisons les décorateurs fournis par le paquet class-validator, décrits en détail ici. De cette manière, toute route qui utilise le CreateUserDto appliquera automatiquement ces règles de validation.

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;
}
astuce

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

En savoir plus sur la transformation

Nous pouvons maintenant utiliser le ValidationPipe dans notre UsersCommands pour appliquer les règles de validation que nous venons de définir.

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"}

Vous pouvez créer un snippet pour le décorateur d'options validé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 }));
astuce

You can create filters to handle and response validation errors.

Consultez les Exception Filters pour plus d'informations