Aller au contenu
NestJS OpenPartie 3, section b
Changer de langue : lire en anglais

b · Ton premier controller

  • Projet : Loup-Garou
  • Environ 40 minutes
  • 3 exercices

Un controller regroupe les routes d’un même domaine. @Controller('api/villages') fixe le préfixe commun à toutes ses routes ; chaque méthode devient une route grâce à un décorateur comme @Get().

src/villages/villages.controller.ts
import { Controller, Get } from '@nestjs/common';
interface Village {
id: string;
nom: string;
}
@Controller('api/villages')
export class VillagesController {
private villages: Village[] = [
{ id: '1', nom: 'Lune Rousse' },
{ id: '2', nom: 'Bois-Dormant' },
];
@Get()
trouverTous(): Village[] {
return this.villages;
}
}

Compare à Express, en partie 2 : pas de res.json(...), pas d’en-tête à poser. Tu retournes une valeur, NestJS la sérialise en JSON tout seul. Ajoute ce controller aux controllers d’AppModule (ou génère-le directement avec npx nest g controller villages, qui s’en charge) pour qu’il soit pris en compte.

@Param('id') extrait un segment :id du chemin et l’injecte directement comme argument — plus besoin de lire req.params toi-même :

import { Controller, Get, NotFoundException, Param } from '@nestjs/common';
@Get(':id')
trouverUn(@Param('id') id: string): Village {
const village = this.villages.find((v) => v.id === id);
if (!village) throw new NotFoundException('Village introuvable');
return village;
}

NotFoundException est une classe fournie par NestJS : la lancer avec throw suffit à renvoyer un statut 404, avec un corps JSON { "message": "...", "statusCode": 404 }. Pas de res.status(404) à écrire — NestJS a une classe équivalente pour chaque code d’erreur HTTP courant (BadRequestException, ForbiddenException…).

@Query('...') fait la même chose pour ?cle=valeur :

import { Query } from '@nestjs/common';
@Get()
trouverTous(@Query('tri') tri?: string): Village[] {
if (tri === 'nom') return [...this.villages].sort((a, b) => a.nom.localeCompare(b.nom));
return this.villages;
}

Exercices 3.4 à 3.6

Projet : marketplace

Génère ProduitsController (npx nest g controller produits), avec un tableau de produits en mémoire (id, nom, categorie). Ajoute GET /api/produits, qui renvoie tout le tableau.

Ajoute GET /api/produits/:id, avec @Param('id'). Lance NotFoundException si aucun produit ne correspond.

Ajoute le support de ?categorie=... sur GET /api/produits, avec @Query('categorie') : si elle est fournie, ne renvoie que les produits de cette catégorie.

Pour vérifier ton travail : npm run test:partie-3 (dépôt d'exercices)