Aller au contenu
NestJS OpenPartie 4, section a
Changer de langue : lire en anglais

a · Les DTO

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

En partie 3, POST /api/villages acceptait @Body() village: Village — mais rien ne garantissait que le corps envoyé ressemblait vraiment à un Village. Un DTO (Data Transfer Object) décrit la forme des données attendues à l’entrée d’une route.

src/villages/dto/creer-village.dto.ts
export class CreerVillageDto {
nombreDeJoueurs: number;
rolesEnJeu: string[];
}
src/villages/villages.controller.ts
import { Body, Controller, Post } from '@nestjs/common';
import { CreerVillageDto } from './dto/creer-village.dto.js';
@Controller('api/villages')
export class VillagesController {
@Post()
creer(@Body() dto: CreerVillageDto) {
// dto.nombreDeJoueurs et dto.rolesEnJeu sont typés
}
}

C’est déjà mieux qu’un any implicite : ton éditeur connaît dto.nombreDeJoueurs, et une faute de frappe sur son nom est détectée à la compilation. Mais ce n’est qu’une promesse TypeScript — au moment où tsc a fini son travail, elle disparaît. Rien n’empêche encore un client d’envoyer { "nombreDeJoueurs": "beaucoup" }, une chaîne au lieu d’un nombre : à l’exécution, personne ne vérifie. La section b comble ce trou.

Exercices 4.1 à 4.3

Projet : marketplace

Crée CreerProduitDto, avec nom: string, prix: number et categorie: string. Utilise-le dans @Body() sur POST /api/produits.

Ajoute un champ variantes: string[] à CreerProduitDto (les tailles ou coloris disponibles pour ce produit). Vérifie avec curl qu’un produit créé avec "variantes": ["S", "M", "L"] les renvoie bien telles quelles.

Envoie un POST /api/produits avec un prix négatif, et un autre sans le champ nom du tout. Observe : les deux sont acceptés, avec un statut 201. Garde ces deux requêtes sous le coude, tu les rejoueras en section b.

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