Menu
CoddyTech

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.

challenge icon

Aufgabe

Einfach

Clients 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.

  1. Gib der Klasse CreateTaskDto in src/tasks/dto/create-task.dto.ts zwei Felder: title, einen String, und done, einen optionalen Boolean.
  2. Ändere in src/tasks/tasks.controller.ts die Methode create. Ihr Parameter @Body() hat jetzt den Typ CreateTaskDto statt { title: string }. Übergib dem Service das gesamte DTO, nicht nur den Titel.
  3. Ändere in src/tasks/tasks.service.ts create, sodass die Methode statt eines Titels das DTO entgegennimmt. Die neue Aufgabe erhält ihren title aus dem DTO und auch ihr done daraus oder false, wenn der Body kein done enthält. Die ID und createdAt funktionieren 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 {}
quiz iconTeste dich selbst

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