PATCHによる部分更新
CoddyのNode.jsジャーニー「REST API」セクションの一部。レッスン 3/18。
タスクを完了としてマークする際に、そのタイトルを再送信する必要はありません。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を送信できます。クライアントがidを変更できないように、req.bodyをオブジェクトに展開するのではなく、フィールドを一つずつコピーしてください。リクエストにボディがない場合、req.bodyはundefinedになり、これを処理するのが?? {}です。応答は、更新後の請求書全体を含む200です。
チャレンジ
簡単PATCH /api/tasks/:idは、リクエスト本文で送信されたフィールド(titleまたはdone)のみを変更します。- タスク全体を返し、ステータスコードは200です。
- 存在しないIDの場合、
{ "error": "Task not found" }を返し、ステータスコードは404です。
PATCH /api/tasks/2に{ "done": true }を送信し、次にGET /api/tasks/2を実行し、その後、同じPATCHを/api/tasks/99に送信します。
自分で試してみよう
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;
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。