Menu
CoddyTech

DTO

Część sekcji TypeScript i NestJS ścieżki Node.js w Coddy. Lekcja 13 z 24.

@Body() body: { title: string } opisuje treść żądania tylko w jednym miejscu i nic jej nie sprawdza: { "title": 42 } przechodzi bezpośrednio. DTO, czyli obiekt transferu danych, to klasa opisująca zawartość treści żądania.

export class CreateOrderDto {
    customer: string;
    express?: boolean;
}

@Post()
create(@Body() dto: CreateOrderDto) {
    return this.ordersService.create(dto);
}

express? oznacza pole opcjonalne. Kontroler i usługa korzystają z tej samej klasy, więc mają zgodną strukturę.

DTO jest klasą, a nie interfejsem, z pewnego powodu. Interfejsy są usuwane wraz z innymi typami podczas uruchamiania kodu, natomiast klasa nadal istnieje. Walidacja w Nest odczytuje reguły zapisane jako dekoratory, a dekoratory wymagają klasy. Tym zajmiemy się w następnej lekcji.

challenge icon

Wyzwanie

Łatwy

Klienci mogą teraz utworzyć zadanie, które jest już wykonane. Opisz treść żądania POST /tasks za pomocą DTO, czyli klasy wymieniającej pola zawarte w treści żądania, i przekaż je aż do serwisu.

  1. W pliku src/tasks/dto/create-task.dto.ts dodaj do klasy CreateTaskDto dwa pola: title, typu string, oraz done, opcjonalne pole typu boolean.
  2. W pliku src/tasks/tasks.controller.ts zmień metodę create. Parametr @Body() ma teraz typ CreateTaskDto zamiast { title: string }. Przekaż do serwisu cały DTO, a nie tylko tytuł.
  3. W pliku src/tasks/tasks.service.ts zmień metodę create, tak aby przyjmowała DTO zamiast tytułu. Nowe zadanie pobiera title z DTO, a także done z DTO albo false, jeśli treść żądania nie zawiera pola done. Id i createdAt działają jak wcześniej.

Wypróbuj: wyślij POST { "title": "Pay rent", "done": true } na adres /tasks. Otrzymasz status 201 i nowe, wykonane zadanie:

{ "id": 4, "title": "Pay rent", "done": true, "createdAt": "2026-10-30T09:15:00.000Z" }

(createdAt pokazuje czas wysłania żądania). Wyślij POST { "title": "Buy milk" }: otrzymasz status 201 z "done": false. Następnie wyślij POST { "title": 42 }. Nadal otrzymasz status 201, a wartość "title": 42 zostanie zapisana: DTO opisuje treść żądania, ale na razie niczego nie sprawdza. W następnej lekcji Nest odmówi przyjęcia takiego żądania.

Spróbuj swoich sił

// Opisz treść żądania POST /tasks: title oraz done, gdy klient je przesyła.
export class CreateTaskDto {}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji TypeScript i NestJS

Poćwicz samodzielnie: Edytor online Express