1件を返す
パスの一部を受け取る
設計図の 2 行目に進みます。
プレーンテキスト
GET /items/:id 商品1件を返す:id は、第3章のルーティングで少しだけ触れた書き方です。そこに何が来ても合うという印で、実際に来た値は req.params から読めます。
JavaScript
app.get("/items/:id", (req, res) => {
console.log(req.params.id);
});/items/3 が来たら req.params.id は "3" になります。名前は :id と書いたところがそのまま使われます。
パスから来る値は必ず文字列
注意すべき点があります。req.params.id は数値ではなく文字列です。
JavaScript
const item = items.find((i) => i.id === req.params.id); // 見つからない1 === "1" は成り立たないので、これでは永遠に見つかりません。数値に直してから比べます。
JavaScript
const item = items.find((i) => i.id === Number(req.params.id));URL の一部として届く値は、いつも文字列だと覚えてください。第5章のクエリパラメータでも同じことが起きます。
無かったときに404を返す
前のレッスンで「一覧が 0 件でも 200」と書きました。1 件を取りに行く場合は違います。
JavaScript
app.get("/items/:id", (req, res) => {
const item = items.find((i) => i.id === Number(req.params.id));
if (!item) {
return res.status(404).json({ error: "商品が見つかりません" });
}
res.json(item);
});/items/999 は「そんな商品は無い」ので 404 です。一覧の 0 件は「集まりは存在して、中身が空」なので 200 でした。対象そのものが無いのか、中身が空なのかで分かれます。
return を付ける理由
上の例で return res.status(404)... と書いているのは大切な点です。return が無いと処理が下へ続き、res.json(item) まで動いてしまいます。
1 つのリクエストに返せる応答は 1 回だけなので、2 回目でエラーになります。返したらその場で抜けるのを習慣にしてください。
手を動かす
演習では、商品 1 件を返す API を作ります。見つからないときの扱いまで含めて書いてください。
要件
GET /items/:idはその id の商品をidnamepriceの形で返す- 見つからないときは 404 で
{"error":"商品が見つかりません"}を返す - パスから来る id は文字列なので、数値に直してから比べる
入出力例
request("GET", "/items/1") → "200 {"id":1,"name":"レザースニーカー","price":4800}"
request("GET", "/items/2") → "200 {"id":2,"name":"古着のデニムジャケット","price":6200}"
request("GET", "/items/999") → "404 {"error":"商品が見つかりません"}"ヒント
編集 ゆめさく編集部