Menu
CoddyTech

POSTによる作成

CoddyのNode.jsジャーニー「REST API」セクションの一部。レッスン 2/25。

タスクを追加するクライアントは、新しいタスクがどこにあるかを知る必要があります。新しいリソースをリストのURLにPOSTで送信すると、サーバーはリソースと、そのURLを示すLocationヘッダーを付けて201 Createdを返します。

POST /api/events   { "name": "Launch party" }

201 Created
Location: /api/events/12
{ "id": 12, "name": "Launch party" }

idはサーバーが割り当てるため、2つのクライアントが同じidを取得することはありません。Locationヘッダーがあれば、クライアントはURLを自分で組み立てずに新しいイベントを取得できます。res.location(path)はそのヘッダーを設定し、res.statusと同じようにチェーンできます。

res.status(201).location(`/api/events/${event.id}`).json(event);
challenge icon

チャレンジ

簡単

クライアントがタスクを追加できる方法が必要です。タスクを作成し、新しいタスクの場所をクライアントに知らせる POST ルートを追加しましょう。

  1. routes/tasks.jsで、POST /api/tasksのルートを追加します(ルーター内でのパスは'/'です)。JSON ボディからtitleを読み取ります。例:{ "title": "Order new chairs" }。
  2. 次の4つのフィールドを持つ新しいタスクを作成します。
    • id:store.jsにあるnextId()関数から取得します。tasksと一緒にインポートします。
    • title:ボディから取得します。
    • done:false。
    • createdAt:new Date().toISOString()。現在の時刻をテキストとして表します。

    tasks配列に追加し、GET /api/tasksでも表示されるようにします。

  3. ステータス201と、新しいタスクをJSONとして返します。Locationヘッダーには、タスク自体のURLを設定します。タスク4の場合は/api/tasks/4です。新規に「実行」したときのレスポンス本文は次のようになります(createdAtは送信した時刻になります)。
    { "id": 4, "title": "Order new chairs", "done": false, "createdAt": "2026-10-30T09:12:44.512Z" }
  4. ボディに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が返り、拒否されたPOSTでは何も追加されないため、GET /api/tasksには引き続き4件のタスクが表示されます。

自分で試してみよう

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プレイグラウンド