c · Les pipes
- Project: Werewolf
- About 35 minutes
- 3 exercises
This content is not available in your language yet.
ValidationPipe est, en fait, un cas particulier d’une idée plus générale : un pipe transforme ou valide un argument avant qu’il n’atteigne ta méthode. Tu peux en appliquer un à un seul paramètre, pas seulement à tout le corps de la requête.
Un pipe fourni par NestJS
Section intitulée « Un pipe fourni par NestJS »ParseIntPipe convertit un paramètre d’URL — toujours une chaîne de caractères — en nombre, et rejette la requête avec un 400 s’il n’est pas numérique :
import { Controller, Get, Param, ParseIntPipe } from '@nestjs/common';
@Get(':id')trouverUn(@Param('id', ParseIntPipe) id: number) { // id est déjà un number ici, garanti}Sans lui, id aurait été la chaîne "1", pas le nombre 1 — et /api/villages/abc aurait atteint ta méthode tel quel, à toi de le détecter.
Écrire son propre pipe
Section intitulée « Écrire son propre pipe »Un pipe est une classe qui implémente PipeTransform, avec une seule méthode, transform :
import { BadRequestException, Injectable, PipeTransform } from '@nestjs/common';
const ROLES = ['loup-garou', 'villageois', 'voyante'] as const;
@Injectable()export class RoleValidePipe implements PipeTransform { transform(valeur: string) { if (!ROLES.includes(valeur as (typeof ROLES)[number])) { throw new BadRequestException(`Rôle inconnu : ${valeur}`); } return valeur; }}@Get('role/:role')trouverParRole(@Param('role', RoleValidePipe) role: string) { // role vaut forcément 'loup-garou', 'villageois' ou 'voyante'}Une valeur par défaut
Section intitulée « Une valeur par défaut »DefaultValuePipe fixe une valeur quand le paramètre est absent — utile pour une query string optionnelle, à combiner avec un autre pipe :
import { DefaultValuePipe, Query } from '@nestjs/common';
@Get()trouverTous(@Query('limite', new DefaultValuePipe(10), ParseIntPipe) limite: number) { // limite vaut 10 si absente, sinon sa valeur convertie en nombre}Exercises 4.8 to 4.10
Project: marketplaceApplique ParseIntPipe au paramètre id de GET /api/produits/:id. Vérifie que /api/produits/1 fonctionne toujours, et que /api/produits/abc échoue désormais avec un 400 — sans que tu aies écrit le moindre if.
Écris CategorieValidePipe, sur le modèle de RoleValidePipe ci-dessus, avec la même liste de catégories que ton DTO (section b). Ajoute une route GET /api/produits/categorie/:categorie qui l’utilise, et renvoie les produits de cette catégorie.
Ajoute ?limite=... à GET /api/produits, avec DefaultValuePipe(10) combiné à ParseIntPipe, pour ne renvoyer que les limite premiers produits. Vérifie que l’appeler sans le paramètre renvoie bien jusqu’à 10 produits, et qu’avec ?limite=1 un seul est renvoyé.
To check your work: npm run test:partie-4 (exercises repository)