Cours NestJS · Module 10: Validation des données

class-validator - Les décorateurs du garde de la porte

3 min de lecture
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-transformer

Dé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 !');
45

Tu 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. 1. Que fait le décorateur @IsString() de la bibliothèque class-validator ?

  2. 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 :