Cours NestJS · Module 10: Validation des données

Le garde de la porte - Introduction à la validation des données

3 min de lecture
Dans cette leçon4

Salve, légionnaire ! Tu as atteint l'un des lieux les plus importants de notre Empire - la Porte principale (Porta Praetoria). Quiconque veut entrer dans la cité doit passer par le poste de contrôle des gardes. De la même manière, chaque requête HTTP qui atteint notre serveur devrait être soigneusement vérifiée avant d'atteindre la logique métier.

La validation des données est le processus qui consiste à vérifier si les données entrantes provenant des utilisateurs sont correctes, sûres et conformes aux attentes. Sans validation, notre serveur est comme une porte ouverte - n'importe qui peut entrer avec n'importe quoi.

Pourquoi la validation est-elle essentielle ?

Imagine un légionnaire s'approchant de la porte et prétendant être un sénateur. Le garde vérifie :

  • Possède-t-il un document d'identité en règle ? (champs requis)
  • Le document n'est-il pas falsifié ? (format correct)
  • Les détails correspondent-ils ? (règles métier)

Dans le monde de NestJS, nous faisons face à une situation analogue :

1// WITHOUT validation - gate wide open!
2@Post('legionaries')
3createLegionary(@Body() body: any) {
4  // Someone can send anything!
5  // { name: 12345, rank: null, age: "cat" }
6  return this.service.create(body);
7}
8
9// WITH validation - guards on duty!
10@Post('legionaries')
11createLegionary(@Body() dto: CreateLegionaryDto) {
12  // Data is verified before it reaches here
13  // name must be a string, rank must exist, age must be a number
14  return this.service.create(dto);
15}

Qu'est-ce qu'un DTO ?

Un DTO (Data Transfer Object) est comme un document impérial officiel - il définit exactement quels champs doivent être présents et quels types ils doivent avoir. Dans NestJS, nous créons des classes DTO qui décrivent la forme des données d'entrée :

1// DTO is like an imperial form
2export class CreateLegionaryDto {
3  name: string;     // Legionary's name
4  rank: string;     // Rank
5  age: number;      // Age
6  legio: string;    // Legion name
7}

Les outils de validation dans NestJS

NestJS offre trois outils principaux pour protéger nos portes :

  1. class-validator - une bibliothèque de décorateurs pour définir les règles de validation
  2. class-transformer - un outil de transformation des données (conversion de types, exclusion de champs)
  3. ValidationPipe - un pipe intégré à NestJS qui exécute automatiquement la validation
1// Installing gate guards
2// npm install class-validator class-transformer

Comment tout cela fonctionne-t-il ensemble ?

L'ensemble du processus de validation dans NestJS fonctionne comme suit :

1// 1. HTTP request arrives at the server
2// POST /legionaries { name: "Marcus", age: 25 }
3
4// 2. ValidationPipe intercepts the data
5// ValidationPipe runs class-transformer (type conversion)
6// Then class-validator (rule checking)
7
8// 3. If data is valid → passes to the controller
9// If data is invalid → returns 400 Bad Request error

Sans ces outils, nous devrions vérifier manuellement chaque champ dans chaque endpoint - c'est comme si tu demandais à chaque centurion de vérifier personnellement les documents au lieu d'avoir des gardes de porte entraînés.

Dans les leçons suivantes, tu apprendras chacun de ces outils en détail. Prépare-toi, car le garde de la porte n'a aucune pitié pour les données invalides !

Code de cette leçon : src/validation-intro.ts
1// Garde de la porte de l'Imperium - Introduction à la validation
2// Comparaison d'endpoints avec et sans validation
3
4import { Controller, Post, Body } from '@nestjs/common';
5
6// ================================
7// SANS VALIDATION - Porte ouverte !
8// ================================
9
10interface RawLegionary {
11  name: any;
12  rank: any;
13  age: any;
14}
15
16@Controller('unsafe')
17class UnsafeController {
18  @Post()
19  create(@Body() body: RawLegionary) {
20    // Quelqu'un pourrait envoyer : { name: 123, rank: null, age: "cat" }
21    console.log('Données reçues (sans validation) :', body);
22    return body;
23  }
24}
25
26// ================================
27// AVEC VALIDATION - Porte gardée !
28// ================================
29
30// Le DTO définit la forme des données
31class CreateLegionaryDto {
32  name: string;   // Doit être une chaîne
33  rank: string;   // Doit être une chaîne
34  age: number;    // Doit être un nombre
35}
36
37@Controller('safe')
38class SafeController {
39  @Post()
40  create(@Body() dto: CreateLegionaryDto) {
41    // Les données sont validées avant d'arriver ici
42    console.log('Données reçues (avec validation) :', dto);
43    return dto;
44  }
45}
46
47console.log('Sans validation : n\'importe qui peut entrer avec n\'importe quoi');
48console.log('Avec validation : le garde de la porte vérifie les documents');
49console.log('DTO = formulaire impérial officiel');
50

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. Qu'est-ce que la validation des données dans le contexte d'une application serveur ?

  2. 2. Qu'est-ce qu'un DTO (Data Transfer Object) dans NestJS ?

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

    Ajoute les décorateurs @IsString, @IsNotEmpty et @IsNumber à la classe CreateGladiatorDto

  • Clique dans l'ordre

    Range les étapes du processus de validation d'une requête HTTP dans NestJS dans le bon ordre :