Menu
CoddyTech

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です。

challenge icon

チャレンジ

簡単
  • 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;
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

REST APIのすべてのレッスン