Menu
CoddyTech

使用 POST 创建

本课属于 Coddy Node.js 学习旅程的“REST API”单元。第 2 课,共 25 课。

添加任务的客户端需要知道新任务位于何处。它会使用 POST 将新资源发送到列表的 URL,服务器则返回 201 Created,并附上该资源和一个指明其 URL 的 Location 标头。

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

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

由服务器选择 id,因此两个客户端绝不会声明同一个 id。借助 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 添加路由(在路由器内部,路径是 '/')。它从 JSON 请求体中读取 title,例如 { "title": "Order new chairs" }。
  2. 使用 4 个字段构建新任务:
    • id:来自 store.js 中的 nextId() 函数。在导入 tasks 时一并导入它。
    • title:来自请求体。
    • done:false。
    • createdAt:new Date().toISOString(),表示当前时间的文本。

    将它添加到 tasks 数组中,这样 GET /api/tasks 也会显示它。

  3. 响应状态码 201,并以 JSON 格式返回新任务。将 Location 标头设置为任务自身的 URL:任务 4 的 URL 是 /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,以及上面的任务,其 id 为 4;响应的 Headers 选项卡会显示 Location: /api/tasks/4。发送 GET /api/tasks/4:你会收到相同的任务。然后向 /api/tasks 发送 POST 请求,请求体为 {}:你会收到状态码 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 在线编辑器