Cours NestJS · Module 10: Validation des données
class-validator - Les décorateurs du garde de la porte
Dans cette leçon4
Maintenant que tu sais ce qu'est la validation, il est temps d'apprendre class-validator - une bibliothèque de décorateurs qui transforme d'ordinaires classes DTO en véritables postes de garde. Chaque décorateur est comme un garde distinct spécialisé dans une vérification spécifique.
Installation
1npm install class-validator class-transformerDécorateurs de base
@IsString() - le garde du texte
Vérifie si la valeur est une chaîne de caractères. C'est comme un garde qui vérifie que le document est écrit sur du papyrus, et non sur de la pierre :
1import { IsString } from 'class-validator';
2
3export class CreateLegionaryDto {
4 @IsString()
5 name: string; // "Marcus", 12345
6}@IsNumber() - le garde des nombres
Vérifie si la valeur est un nombre :
1import { IsNumber } from 'class-validator';
2
3export class CreateLegionaryDto {
4 @IsNumber()
5 age: number; // 25, "twenty five"
6}@IsEmail() - le garde des messages
Vérifie la validité du format d'une adresse e-mail :
1import { IsEmail } from 'class-validator';
2
3export class CreateLegionaryDto {
4 @IsEmail()
5 cursusPublicus: string; // "marcus@roma.com", "marcus"
6}@IsNotEmpty() - le garde des champs vides
Ne laisse pas passer les valeurs vides - chaque champ doit avoir un contenu :
1import { IsNotEmpty, IsString } from 'class-validator';
2
3export class CreateLegionaryDto {
4 @IsString()
5 @IsNotEmpty()
6 name: string; // "Marcus", "", null
7}@MinLength() et @MaxLength() - les gardes de la longueur
Contrôlent la longueur minimale et maximale du texte :
1import { MinLength, MaxLength, IsString } from 'class-validator';
2
3export class CreateLegionaryDto {
4 @IsString()
5 @MinLength(2)
6 @MaxLength(50)
7 name: string; // "Marcus", "M", "A".repeat(51)
8}Combiner les décorateurs
La véritable puissance de class-validator réside dans la combinaison de plusieurs décorateurs sur un seul champ. C'est comme plusieurs gardes qui vérifient différents aspects d'un même document :
1import {
2 IsString,
3 IsNotEmpty,
4 MinLength,
5 MaxLength,
6 IsNumber,
7 IsEmail,
8 Min,
9 Max,
10} from 'class-validator';
11
12export class CreateLegionaryDto {
13 @IsString()
14 @IsNotEmpty()
15 @MinLength(2)
16 @MaxLength(50)
17 name: string;
18
19 @IsString()
20 @IsNotEmpty()
21 rank: string;
22
23 @IsNumber()
24 @Min(16)
25 @Max(65)
26 age: number;
27
28 @IsEmail()
29 cursusPublicus: string;
30
31 @IsString()
32 @IsNotEmpty()
33 legio: string;
34}Messages d'erreur personnalisés
Chaque décorateur accepte un paramètre optionnel avec un message d'erreur - ainsi le garde peut expliquer ce qui ne va pas :
1export class CreateLegionaryDto {
2 @IsString({ message: 'Name must be a text, legionary!' })
3 @IsNotEmpty({ message: 'Name cannot be empty!' })
4 @MinLength(2, { message: 'Name must have at least 2 characters!' })
5 name: string;
6
7 @IsNumber({}, { message: 'Age must be a number!' })
8 @Min(16, { message: 'You must be at least 16 years old to join the legion!' })
9 age: number;
10}Grâce à class-validator, tu crées un garde robuste qui rejette automatiquement les données invalides avant qu'elles n'atteignent la logique métier. Dans la prochaine leçon, tu découvriras des décorateurs avancés !
Code de cette leçon : src/basic-decorators.ts
1// class-validator - Décorateurs de garde de base
2import {
3 IsString,
4 IsNotEmpty,
5 IsNumber,
6 IsEmail,
7 MinLength,
8 MaxLength,
9 Min,
10 Max,
11} from 'class-validator';
12
13// DTO de recrutement de légionnaire
14export class CreateLegionaryDto {
15 @IsString({ message: 'Name must be a string!' })
16 @IsNotEmpty({ message: 'Name cannot be empty!' })
17 @MinLength(2, { message: 'Name must have at least 2 characters!' })
18 @MaxLength(50)
19 name: string;
20
21 @IsString()
22 @IsNotEmpty()
23 rank: string;
24
25 @IsNumber({}, { message: 'Age must be a number!' })
26 @Min(16, { message: 'Minimum 16 years to join the legion!' })
27 @Max(65)
28 age: number;
29
30 @IsEmail({}, { message: 'Invalid email!' })
31 cursusPublicus: string;
32}
33
34// TODO : Créer la classe CreateTributeDto avec les champs :
35// - provinceName: string (requis, min 3 caractères)
36// - amount: number (min 1, max 10000)
37// - collectorEmail: string (doit être un email)
38// - description: string (optionnel, max 200 caractères)
39
40export class CreateTributeDto {
41 // Ajoute ici les décorateurs de validation
42}
43
44console.log('Décorateurs class-validator prêts !');
45Tu as repéré une erreur dans cette leçon ?
Teste tes connaissances
Réponds aux questions de cette leçon. Choisis une réponse pour voir tout de suite si elle est correcte.
1. Que fait le décorateur @IsString() de la bibliothèque class-validator ?
2. Quel est l'effet de l'utilisation du décorateur @IsNotEmpty() ?
Voici 2 des 3 questions de cette leçon. Réponds aux autres dans le jeu.
Tâches pratiques dans le jeu
- Éditeur de code
Complète les décorateurs de validation manquants dans la classe CreateMessengerDto
- Tri vertical
Range les décorateurs de validation du champ « name » du plus général au plus spécifique :
- Éditeur de code
Complète les décorateurs avec des messages d'erreur personnalisés dans CreateTaxCollectorDto
- Clique dans l'ordre
Range les étapes d'installation et de configuration de la validation dans NestJS :