Cours NestJS · Module 10: Validation des données
Le garde de la porte - Introduction à la validation des données
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 :
- class-validator - une bibliothèque de décorateurs pour définir les règles de validation
- class-transformer - un outil de transformation des données (conversion de types, exclusion de champs)
- ValidationPipe - un pipe intégré à NestJS qui exécute automatiquement la validation
1// Installing gate guards
2// npm install class-validator class-transformerComment 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 errorSans 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');
50Tu 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. Qu'est-ce que la validation des données dans le contexte d'une application serveur ?
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 :