Создание с помощью 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);Задание
ЛегкоКлиентам нужен способ добавлять задачи. Добавьте маршрут POST, который создаёт задачу и сообщает клиенту, где находится новая задача.
- В
routes/tasks.jsдобавьте маршрут дляPOST /api/tasks(внутри маршрутизатора этот путь —'/'). Он считываетtitleиз тела JSON, например{ "title": "Order new chairs" }. - Создайте новую задачу с четырьмя полями:
id: из функцииnextId()вstore.js. Импортируйте её рядом сtasks.title: из тела запроса.done:false.createdAt:new Date().toISOString(), текущее время в виде текста.
Добавьте её в массив
tasks, чтобы она также отображалась при запросеGET /api/tasks. - Ответьте со статусом 201 и новой задачей в формате JSON. Установите заголовок
Locationв URL самой задачи: для задачи 4 это/api/tasks/4. При первом запуске тело ответа выглядит так (значениеcreatedAtбудет соответствовать моменту отправки запроса):{ "id": 4, "title": "Order new chairs", "done": false, "createdAt": "2026-10-30T09:12:44.512Z" } - Если в теле запроса нет
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
1Ресурсы и глаголы
Ресурсы и URLСоздание с помощью POST4Браузеры, версии и конфигурация
Что такое originРазрешение другого originCORSСтраница, вызывающая APIПотренируйтесь самостоятельно: Песочница Express