Menu
CoddyTech

Создание с помощью POST

Часть раздела REST API путешествия по Node.js на Coddy. Урок 2 из 25.

Клиенту, который добавляет задачу, нужно знать, где находится новая задача. Он отправляет новый ресурс на URL списка с помощью POST, а сервер отвечает 201 Created, передавая ресурс и заголовок Location с URL этого ресурса.

POST /api/events   { "name": "Launch party" }

201 Created
Location: /api/events/12
{ "id": 12, "name": "Launch party" }

Сервер выбирает идентификатор, поэтому два клиента никогда не смогут выбрать один и тот же. С заголовком Location клиент может получить новое событие, не составляя URL самостоятельно. res.location(path) задаёт этот заголовок; вызовы можно объединять в цепочку, как и res.status:

res.status(201).location(`/api/events/${event.id}`).json(event);
challenge icon

Задание

Легко

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

  1. В routes/tasks.js добавьте маршрут для POST /api/tasks (внутри маршрутизатора этот путь — '/'). Он считывает title из тела JSON, например { "title": "Order new chairs" }.
  2. Создайте новую задачу с четырьмя полями:
    • id: из функции nextId() в store.js. Импортируйте её рядом с tasks.
    • title: из тела запроса.
    • done: false.
    • createdAt: new Date().toISOString(), текущее время в виде текста.

    Добавьте её в массив tasks, чтобы она также отображалась при запросе GET /api/tasks.

  3. Ответьте со статусом 201 и новой задачей в формате JSON. Установите заголовок Location в URL самой задачи: для задачи 4 это /api/tasks/4. При первом запуске тело ответа выглядит так (значение createdAt будет соответствовать моменту отправки запроса):
    { "id": 4, "title": "Order new chairs", "done": false, "createdAt": "2026-10-30T09:12:44.512Z" }
  4. Если в теле запроса нет title, ответьте со статусом 400 и { "error": "title is required" }, ничего не добавляя в список.

Попробуйте: выберите POST, укажите путь /api/tasks и тело { "title": "Order new chairs" }. Вы должны увидеть статус 201 и задачу выше с идентификатором 4, а на вкладке заголовков ответа будет показан Location: /api/tasks/4. Отправьте GET /api/tasks/4: вы получите ту же задачу. Затем отправьте POST с телом {} на /api/tasks: вы получите статус 400 с сообщением об ошибке, а запрос GET /api/tasks по-прежнему будет возвращать 4 задачи, поскольку отклонённый запрос POST ничего не добавил.

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

import { Router } from 'express';
import { tasks } from '../store.js';

const router = Router();

router.get('/', (req, res) => {
    res.json(tasks);
});

router.get('/:id', (req, res) => {
    const task = tasks.find((t) => t.id === Number(req.params.id));
    if (!task) {
        return res.status(404).json({ error: 'Task not found' });
    }
    res.json(task);
});

export default router;

Все уроки раздела REST API

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