使用 PATCH 进行部分更新
本课属于 Coddy Node.js 学习旅程的“REST API”单元。第 3 课,共 25 课。
将任务标记为已完成,不应该意味着要再次发送它的标题。PATCH只携带发生变化的字段,服务器会保留其他所有字段的原样。
// PATCH /api/invoices/7 { "paid": true }
const { paid, amount } = req.body ?? {};
if (paid !== undefined) invoice.paid = paid;
if (amount !== undefined) invoice.amount = amount;
res.json(invoice);逐个检查字段是否为 undefined,不要使用 if (paid):false也是客户端可以发送的值。逐个复制字段,不要将 req.body 展开到对象上,这样客户端就无法更改 id。请求没有正文时,req.body的值是 undefined,?? {}就是用来处理这种情况的。答案是返回包含完整更新后发票的 200 响应。
挑战
简单PATCH /api/tasks/:id只会更改请求正文中发送的字段:title或done。- 成功时会返回状态码 200 和完整任务。
- 如果 id 不存在,会返回状态码 404 和
{ "error": "Task not found" }。
向 PATCH /api/tasks/2 发送 { "done": true },然后请求 GET /api/tasks/2,再向 /api/tasks/99 发送相同的 PATCH 请求。
亲手试试
import { Router } from 'express';
import { nextId, 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);
});
router.post('/', (req, res) => {
const { title } = req.body ?? {};
if (!title) {
return res.status(400).json({ error: 'title is required' });
}
const task = { id: nextId(), title, done: false, createdAt: new Date().toISOString() };
tasks.push(task);
res.status(201).location(`/api/tasks/${task.id}`).json(task);
});
export default router;
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
REST API中的所有课
自己练习: Express 在线编辑器