Menu
CoddyTech

DTO

Termasuk bagian TypeScript dan NestJS dalam perjalanan Node.js di Coddy. Pelajaran 13 dari 24.

@Body() body: { title: string } menjelaskan body hanya di satu tempat, dan tidak ada yang memeriksanya: { "title": 42 } langsung diteruskan. DTO, singkatan dari objek transfer data, adalah class yang menjelaskan isi body permintaan.

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

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

express? menandai field opsional. Controller dan service menggunakan class yang sama, jadi keduanya sepakat tentang strukturnya.

DTO berupa class, bukan interface, karena ada alasannya. Interface dihapus bersama tipe lainnya saat kode dijalankan, sedangkan class tetap ada. Validasi Nest membaca aturan yang ditulis sebagai decorator, dan decorator memerlukan class. Itu akan dibahas di pelajaran berikutnya.

challenge icon

Tantangan

Mudah

Client kini dapat membuat task yang sudah selesai. Jelaskan body POST /tasks dengan DTO, sebuah class yang mencantumkan field yang dimiliki body permintaan, lalu teruskan semuanya hingga ke service.

  1. Di src/tasks/dto/create-task.dto.ts, beri class CreateTaskDto dua field: title, sebuah string, dan done, boolean opsional.
  2. Di src/tasks/tasks.controller.ts, ubah method create. Parameter @Body()-nya kini bertipe CreateTaskDto, bukan { title: string }. Teruskan seluruh DTO ke service, bukan hanya title.
  3. Di src/tasks/tasks.service.ts, ubah create agar menerima DTO, bukan title. Task baru mendapatkan title dari DTO, dan done juga dari DTO, atau false jika body tidak memiliki done. Id dan createdAt tetap bekerja seperti sebelumnya.

Coba: kirim POST { "title": "Pay rent", "done": true } ke /tasks. Kamu mendapatkan 201 dan task baru yang sudah selesai:

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

(createdAt menunjukkan waktu permintaanmu.) Kirim POST { "title": "Buy milk" }: 201 dengan "done": false. Lalu kirim POST { "title": 42 }. Kamu tetap mendapatkan 201, dengan "title": 42 tersimpan: DTO menjelaskan body, tetapi belum memeriksa apa pun. Pelajaran berikutnya membuat Nest menolaknya.

Coba sendiri

// Jelaskan body dari POST /tasks: sebuah judul, dan done saat client mengirimkannya.
export class CreateTaskDto {}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di TypeScript dan NestJS

Latihan sendiri: Playground Express