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 считывает правила, записанные в виде декораторов, а декораторам нужен класс. Об этом — в следующем уроке.
Задание
ЛегкоТеперь клиенты могут создавать задачу, которая уже выполнена. Опиши тело запроса POST /tasks с помощью DTO — класса, в котором перечислены поля тела запроса, — и передай его вплоть до сервиса.
- В
src/tasks/dto/create-task.dto.tsдобавь в классCreateTaskDtoдва поля:title— строку иdone— необязательное логическое значение. - В
src/tasks/tasks.controller.tsизмени методcreate. Теперь параметр@Body()имеет типCreateTaskDtoвместо{ title: string }. Передай сервису весь DTO, а не только заголовок. - В
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 {}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела TypeScript и NestJS
Потренируйтесь самостоятельно: Песочница Express