Skip to content
NestJS OpenPart 4, section c
Change language: read in French

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.

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.

Un pipe est une classe qui implémente PipeTransform, avec une seule méthode, transform :

src/villages/pipes/role-valide.pipe.ts
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'
}

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: marketplace

Applique 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)