Menu
CoddyTech

Создание задач

Часть раздела 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) у метода изменил бы это поведение; для создания оставь как есть.

challenge icon

Задание

Легко

Клиентам нужно не только читать задачи, но и добавлять их. Добавь маршрут, который создаёт задачу на основе JSON, отправленного клиентом.

  1. В src/tasks/tasks.controller.ts добавь в TasksController метод (назови его create) для POST /tasks. Пометь его с помощью @Post(), а JSON-тело запроса считай с помощью @Body() в параметре метода. Оба декоратора импортируются из @nestjs/common.
  2. Создай задачу на основе title из тела запроса. Назначь ей id, которого нет у других задач: на единицу больше наибольшего идентификатора в this.tasks. Новая задача ещё не выполнена, поэтому done должно быть равно false.
  3. Добавь задачу в this.tasks, чтобы позднее её можно было найти с помощью GET /tasks и GET /tasks/:id. Верни новую задачу.
  4. Не задавай статус самостоятельно. 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

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