Menu
CoddyTech

使用 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 响应。

challenge icon

挑战

简单
  • 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;
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

REST API中的所有课

自己练习: Express 在线编辑器