使用 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);挑战
简单客户端需要一种添加任务的方式。添加一个 POST 路由来创建任务,并告知客户端新任务所在的位置。
- 在
routes/tasks.js中,为POST /api/tasks添加路由(在路由器内部,路径是'/')。它从 JSON 请求体中读取title,例如{ "title": "Order new chairs" }。 - 使用 4 个字段构建新任务:
id:来自store.js中的nextId()函数。在导入tasks时一并导入它。title:来自请求体。done:false。createdAt:new Date().toISOString(),表示当前时间的文本。
将它添加到
tasks数组中,这样GET /api/tasks也会显示它。 - 响应状态码 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" } - 如果请求体中没有
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 在线编辑器