適切なHTTPメソッド、適切なステータスコード、そしてリクエストボディの検証を用いて、きれいなREST APIを設計しましょう。
このレッスンを Kodokon で開くREST APIは、HTTPメソッドで操作されるリソース(ユーザー、タスク、注文)を公開します。GETで読み取り、POSTで作成、PUTまたはPATCHで更新、DELETEで削除します。プロの慣習では、URLには複数形の名詞を使い、動詞は決して使いません。/createTaskではなくPOST /tasksと書きます。まずはメモリ上で動く小さなタスクAPIを作ってみましょう。
import express from "express";
const app = express();
app.use(express.json());
const tasks = [
{ id: 1, title: "Review the module", done: false }
];
app.get("/tasks", (req, res) => {
res.json(tasks);
});
app.listen(3000);app.use(express.json())という行は欠かせません。これがないと、あらゆるJSONリクエストでreq.bodyはundefinedになります。作成時には、必ず入力を検証し、201で応答し、作成したリソースを返しましょう。こうすることで、クライアントはサーバーが生成したidを取得できます。
app.post("/tasks", (req, res) => {
const { title } = req.body;
if (!title) {
return res.status(400).json({
error: "The title field is required"
});
}
const task = {
id: tasks.length + 1,
title,
done: false
};
tasks.push(task);
res.status(201).json(task);
});毎日使うことになるコードを覚えておきましょう。200は読み取りや更新の成功、201はリソースの作成、204は内容のない成功(削除)、400は無効なリクエスト、404はリソースが見つからない、500はサーバーエラーです。ルールはこうです。4xxならクライアントが間違えた、5xxならあなたのコードが失敗した、ということです。
app.delete("/tasks/:id", (req, res) => {
const id = Number(req.params.id);
const index = tasks.findIndex((t) => t.id === id);
if (index === -1) {
return res.status(404).json({
error: "Task not found"
});
}
tasks.splice(index, 1);
res.status(204).end();
});req.bodyはundefinedのままになりますか?app.use(express.json())app.use(express.static(...))app.listen(3000)titleフィールドなしでPOSTを送ってきました。APIの正しい反応はどれですか?