DTOs
Fait partie de la section TypeScript et NestJS du Journey Node.js de Coddy. Leçon 13 sur 24.
@Body() body: { title: string } décrit le corps à un seul endroit, et rien ne le vérifie : { "title": 42 } passe directement. Un DTO, ou objet de transfert de données, est une classe qui décrit le contenu du corps d’une requête.
export class CreateOrderDto {
customer: string;
express?: boolean;
}
@Post()
create(@Body() dto: CreateOrderDto) {
return this.ordersService.create(dto);
}express? indique un champ facultatif. Le contrôleur et le service partagent la classe et s’accordent donc sur sa structure.
Un DTO est une classe, et non une interface, pour une raison précise. Les interfaces sont supprimées avec les autres types lors de l’exécution du code, tandis qu’une classe existe toujours. La validation de Nest lit les règles écrites sous forme de décorateurs, et les décorateurs ont besoin d’une classe. C’est le sujet de la prochaine leçon.
Défi
FacileLes clients peuvent désormais créer une tâche déjà terminée. Décrivez le corps de POST /tasks avec un DTO, une classe qui répertorie les champs contenus dans le corps d’une requête, puis transmettez-le jusqu’au service.
- Dans
src/tasks/dto/create-task.dto.ts, donnez à la classeCreateTaskDtodeux champs :title, une chaîne de caractères, etdone, un booléen facultatif. - Dans
src/tasks/tasks.controller.ts, modifiez la méthodecreate. Le paramètre@Body()est maintenant de typeCreateTaskDtoau lieu de{ title: string }. Transmettez le DTO entier au service, et pas seulement le titre. - Dans
src/tasks/tasks.service.ts, modifiezcreatepour qu’elle prenne le DTO au lieu d’un titre. La nouvelle tâche obtient sontitledepuis le DTO, ainsi que sondone, oufalsesi le corps ne contient pas dedone. L’id etcreatedAtfonctionnent comme avant.
Essayez : envoyez { "title": "Pay rent", "done": true } par POST à /tasks. Vous obtenez 201 et la nouvelle tâche, terminée :
{ "id": 4, "title": "Pay rent", "done": true, "createdAt": "2026-10-30T09:15:00.000Z" }(createdAt indique l’heure de votre requête.) Envoyez { "title": "Buy milk" } par POST : 201 avec "done": false. Envoyez ensuite { "title": 42 } par POST. Vous obtenez toujours 201, avec "title": 42 enregistré : le DTO décrit le corps, mais ne vérifie encore rien. La prochaine leçon apprendra à Nest à le refuser.
Essayez vous-même
// Décrivez le corps de POST /tasks : un title, et done lorsque le client l’envoie.
export class CreateTaskDto {}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de TypeScript et NestJS
1Les bases de Nest
Classes et méthodesBonjour, NestEnregistrer un contrôleur4Gardes, filtres, intercepteurs
GardesEntraînez-vous par vous-même : Playground Express