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);チャレンジ
簡単クライアントがタスクを追加できる方法が必要です。タスクを作成し、新しいタスクの場所をクライアントに知らせる POST ルートを追加しましょう。
routes/tasks.jsで、POST /api/tasksのルートを追加します(ルーター内でのパスは'/'です)。JSON ボディからtitleを読み取ります。例:{ "title": "Order new chairs" }。- 次の4つのフィールドを持つ新しいタスクを作成します。
id:store.jsにあるnextId()関数から取得します。tasksと一緒にインポートします。title:ボディから取得します。done:false。createdAt:new Date().toISOString()。現在の時刻をテキストとして表します。
tasks配列に追加し、GET /api/tasksでも表示されるようにします。 - ステータス201と、新しいタスクをJSONとして返します。
Locationヘッダーには、タスク自体のURLを設定します。タスク4の場合は/api/tasks/4です。新規に「実行」したときのレスポンス本文は次のようになります(createdAtは送信した時刻になります)。{ "id": 4, "title": "Order new chairs", "done": false, "createdAt": "2026-10-30T09:12:44.512Z" } - ボディに
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プレイグラウンド