Menu
CoddyTech

DTO

Часть раздела TypeScript и NestJS путешествия по Node.js на Coddy. Урок 13 из 24.

@Body() body: { title: string } описывает тело запроса только в одном месте, и его никто не проверяет: { "title": 42 } проходит без изменений. DTO — объект передачи данных, класс, описывающий содержимое тела запроса.

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

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

express? обозначает необязательное поле. Контроллер и сервис используют один и тот же класс, поэтому их представления о структуре совпадают.

DTO — это класс, а не интерфейс, и на то есть причина. Интерфейсы удаляются вместе с другими типами при выполнении кода, а класс продолжает существовать. Для проверки Nest считывает правила, записанные в виде декораторов, а декораторам нужен класс. Об этом — в следующем уроке.

challenge icon

Задание

Легко

Теперь клиенты могут создавать задачу, которая уже выполнена. Опиши тело запроса POST /tasks с помощью DTO — класса, в котором перечислены поля тела запроса, — и передай его вплоть до сервиса.

  1. В src/tasks/dto/create-task.dto.ts добавь в класс CreateTaskDto два поля: title — строку и done — необязательное логическое значение.
  2. В src/tasks/tasks.controller.ts измени метод create. Теперь параметр @Body() имеет тип CreateTaskDto вместо { title: string }. Передай сервису весь DTO, а не только заголовок.
  3. В src/tasks/tasks.service.ts измени метод create, чтобы он принимал DTO вместо заголовка. Новая задача получает значение title из DTO, а также значение done из DTO или false, если в теле запроса нет done. Идентификатор и createdAt работают как прежде.

Попробуй: отправь POST-запрос с телом { "title": "Pay rent", "done": true } на /tasks. В ответ получишь код 201 и новую задачу, отмеченную как выполненную:

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

(createdAt показывает время твоего запроса.) Отправь POST-запрос с телом { "title": "Buy milk" }: в ответ получишь код 201 и "done": false. Затем отправь POST-запрос с телом { "title": 42 }. Ты по-прежнему получишь код 201, а значение "title": 42 будет сохранено: DTO описывает тело запроса, но пока ничего не проверяет. На следующем уроке Nest будет отклонять такие запросы.

Попробуйте сами

// Опишите тело запроса POST /tasks: title и done, если клиент передаёт это поле.
export class CreateTaskDto {}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела TypeScript и NestJS

Потренируйтесь самостоятельно: Песочница Express