Создание задач
Часть раздела TypeScript и NestJS путешествия по Node.js на Coddy. Урок 6 из 24.
Клиент, который создаёт задачу, отправляет её в формате JSON в теле запроса и ожидает получить сохранённую задачу в ответе.
@Post()
create(@Body() review: { stars: number }) {
this.reviews.push(review);
return review;
}@Post() сопоставляет POST по пути контроллера с методом, а @Body() передаёт ему разобранный JSON. Nest самостоятельно считывает тела запросов JSON, поэтому добавлять express.json() не нужно.
Nest отвечает на POST-кодом 201 Created — статусом, который означает, что создан новый ресурс, а на все остальные методы — кодом 200. @HttpCode(200) у метода изменил бы это поведение; для создания оставь как есть.
Задание
ЛегкоКлиентам нужно не только читать задачи, но и добавлять их. Добавь маршрут, который создаёт задачу на основе JSON, отправленного клиентом.
- В
src/tasks/tasks.controller.tsдобавь вTasksControllerметод (назови егоcreate) дляPOST /tasks. Пометь его с помощью@Post(), а JSON-тело запроса считай с помощью@Body()в параметре метода. Оба декоратора импортируются из@nestjs/common. - Создай задачу на основе
titleиз тела запроса. Назначь ейid, которого нет у других задач: на единицу больше наибольшего идентификатора вthis.tasks. Новая задача ещё не выполнена, поэтомуdoneдолжно быть равноfalse. - Добавь задачу в
this.tasks, чтобы позднее её можно было найти с помощьюGET /tasksиGET /tasks/:id. Верни новую задачу. - Не задавай статус самостоятельно. Nest автоматически отвечает на POST-запрос кодом 201 «Создано».
Попробуй: выбери POST, укажи путь /tasks и тело { "title": "Buy milk" }. В ответ получишь код 201 и:
{ "id": 4, "title": "Buy milk", "done": false }Отправь GET /tasks/4: получишь ту же задачу. Затем отправь POST-запрос с пустым телом — {}. Пока тело запроса никто не проверяет, поэтому ты всё равно получишь код 201 и задачу без названия: { "id": 5, "done": false }. В главе «Валидация» это будет исправлено.
Попробуйте сами
import { Controller, Get, Param, Query } from '@nestjs/common';
interface Task {
id: number;
title: string;
done: boolean;
}
@Controller('tasks')
export class TasksController {
private tasks: Task[] = [
{ id: 1, title: 'Write the README', done: true },
{ id: 2, title: 'Fix the login bug', done: false },
{ id: 3, title: 'Plan the sprint', done: false },
];
@Get()
findAll(@Query('done') done?: string): Task[] {
if (done === undefined) {
return this.tasks;
}
return this.tasks.filter((task) => task.done === (done === 'true'));
}
@Get(':id')
findOne(@Param('id') id: string): Task | undefined {
return this.tasks.find((task) => task.id === Number(id));
}
}
Все уроки раздела TypeScript и NestJS
1Основы Nest
Классы и методыПривет, NestРегистрация контроллера4Guards, фильтры и перехватчики
GuardsПотренируйтесь самостоятельно: Песочница Express