DTOs
Teil des Abschnitts TypeScript und NestJS der Node.js-Journey von Coddy. Lektion 13 von 24.
@Body() body: { title: string } beschreibt den Body nur an einer Stelle, und nichts überprüft ihn: { "title": 42 } wird direkt durchgereicht. Ein DTO, ein Datenübertragungsobjekt, ist eine Klasse, die beschreibt, was ein Request-Body enthält.
export class CreateOrderDto {
customer: string;
express?: boolean;
}
@Post()
create(@Body() dto: CreateOrderDto) {
return this.ordersService.create(dto);
}express? kennzeichnet ein optionales Feld. Der Controller und der Service verwenden dieselbe Klasse und stimmen so darin überein, welche Struktur die Daten haben.
Ein DTO ist aus gutem Grund eine Klasse und kein Interface. Interfaces werden beim Ausführen des Codes zusammen mit den anderen Typen entfernt, während eine Klasse weiterhin existiert. Die Validierung von Nest liest Regeln, die als Decorators geschrieben sind, und Decorators benötigen eine Klasse. Darum geht es in der nächsten Lektion.
Aufgabe
EinfachClients können jetzt eine Aufgabe erstellen, die bereits erledigt ist. Beschreibe den Body von POST /tasks mit einem DTO, einer Klasse, die die Felder auflistet, die ein Request-Body enthält, und übergib es bis zum Service.
- Gib der Klasse
CreateTaskDtoinsrc/tasks/dto/create-task.dto.tszwei Felder:title, einen String, unddone, einen optionalen Boolean. - Ändere in
src/tasks/tasks.controller.tsdie Methodecreate. Ihr Parameter@Body()hat jetzt den TypCreateTaskDtostatt{ title: string }. Übergib dem Service das gesamte DTO, nicht nur den Titel. - Ändere in
src/tasks/tasks.service.tscreate, sodass die Methode statt eines Titels das DTO entgegennimmt. Die neue Aufgabe erhält ihrentitleaus dem DTO und auch ihrdonedaraus oderfalse, wenn der Body keindoneenthält. Die ID undcreatedAtfunktionieren wie zuvor.
Probiere es aus: Sende { "title": "Pay rent", "done": true } per POST an /tasks. Du erhältst den Status 201 und die neue Aufgabe, als erledigt markiert:
{ "id": 4, "title": "Pay rent", "done": true, "createdAt": "2026-10-30T09:15:00.000Z" }(createdAt zeigt den Zeitpunkt deiner Anfrage an.) Sende { "title": "Buy milk" } per POST: Status 201 mit "done": false. Sende dann { "title": 42 } per POST. Du erhältst weiterhin den Status 201, und "title": 42 wird gespeichert: Das DTO beschreibt den Body, prüft aber noch nichts. In der nächsten Lektion wird Nest die Anfrage ablehnen.
Probier es selbst
// Beschreibe den Request-Body von POST /tasks: einen Titel und done, wenn der Client es mitsendet.
export class CreateTaskDto {}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in TypeScript und NestJS
Übe selbstständig: Express-Playground