Première API NestJS
Contrôleur décoré, exceptions spécialisées, curl.
Objectifs
À la fin de cette leçon, vous saurez :
- créer contrôleur, service et module pour une ressource ;
- brancher les paramètres de route et le corps ;
- lancer l'application et tester au curl.
🔗 Pour vous rafraîchir la mémoire : décorateurs et metadata · les bases TypeScript · package.json et scripts npm · en-têtes HTTP et JSON
Génération du squelette
nest generate resource tasks # ou à la main :
src/tasks/
├── tasks.module.ts
├── tasks.controller.ts
├── tasks.service.ts
├── dto/create-task.dto.ts
└── entities/task.entity.ts
Le service : votre logique
@Injectable()
export class TasksService {
private taches: Tache[] = []; // remplacé par un repo au chapitre ORM
creer(dto: CreateTaskDto): Tache {
const tache = { id: Date.now(), fait: false, ...dto };
this.taches.push(tache);
return tache;
}
trouver(id: number): Tache {
const t = this.taches.find((t) => t.id === id);
if (!t) throw new NotFoundException(`Tâche ${id} inconnue`);
return t;
}
}
Notez NotFoundException : lancée n'importe où, elle devient automatiquement une réponse 404 JSON — vos traductions d'erreurs du chapitre 19, standardisées.
Le contrôleur : les routes
@Controller('tasks')
export class TasksController {
constructor(private readonly service: TasksService) {}
@Get()
lister() { return this.service.lister(); }
@Get(':id')
voir(@Param('id', ParseIntPipe) id: number) {
return this.service.trouver(id);
}
@Post()
@HttpCode(201)
creer(@Body() dto: CreateTaskDto) {
return this.service.creer(dto);
}
@Delete(':id')
@HttpCode(204)
supprimer(@Param('id', ParseIntPipe) id: number) {
this.service.supprimer(id);
}
}
Chaque décorateur correspond à un mécanisme que vous avez écrit à la main : @Param = segments[1], ParseIntPipe = Number() + validation, @HttpCode = writeHead.
Tester
npm run start:dev
curl localhost:3000/api/tasks
curl -X POST localhost:3000/api/tasks -H "Content-Type: application/json" -d '{"titre":"Test"}'
Exercice
- Ajoutez PATCH avec son DTO partiel (PartialType).
- Lancez une requête avec id="abc" : quel statut ? Qui l'a produit ?
- Comparez ce contrôleur à votre defi-api-complete vanilla : même table de routes ?
Résumé
- Décorateurs = déclaration ; Nest assemble et exécute.
- Exceptions spécialisées = codes HTTP propres sans try/catch manuel.
Correction disponibleCherchez d’abord par vous-même.Voir la correction
Correction
Réponses détaillées
Question 2. 400 Bad Request : ParseIntPipe rejette "abc" avant d'atteindre la méthode — la validation des types d'URL est déléguée au pipe.