1. ある商品は200
  2. 別の商品も200
  3. 消えた商品は404。落ちないこと
  4. 数字でない id も404
コース一覧
Express道場 fleama開発室のIssue10件
#103 消えた商品を開くと落ちる

Express道場 fleama開発室のIssue10件

Node.js入門で作り上げた fleama API の開発室に、スプリントの助っ人として参加する演習専用コースです。解説はありません。1問が1件の Issue で、報告者は商店街の住人たち。依頼と完成条件だけを読み、白紙から自分で組み立てます。手が止まったときのために、方針・使う構文・部分解の3段階のヒントを各問に用意しています。ヘルスチェックから始まり、一覧API、404の扱い、並び替えとページング、入力検証、自作ミドルウェア、エラー形式の統一、所有者チェック、二重販売を止めるトランザクションを経て、最後はいいね機能をエンドポイント設計から任されるところまで、10件の Issue で Express の主要な道具を一巡します。1問15分から45分、全10問で約5時間です。Node.js入門を終えて「作れたけれど実務で通用するか不安」と感じている方に向いています。

1
今週のスプリント
01. #101 監視用ヘルスチェックが欲しい15分
02. #102 カテゴリ一覧APIが欲しい20分
03. #103 消えた商品を開くと落ちる20分
04. #104 検索に並び替えとページングを25分
05. #105 0円出品が通ってしまう25分
06. #106 調査用のアクセスログを25分
07. #107 エラーの形式がバラバラ30分
08. #108 他人の出品を値下げできてしまう30分
09. #109 同じ商品が2人に売れた35分
10. #110 新機能「いいね」を設計から45分

#103 消えた商品を開くと落ちる

初段 / 目安 20分

3件目は障害の報告です。


Issue #103 消えた商品を開くと落ちる

報告者: 松田(事務局・掘り出し物ハンター)

「売り切れて消えた商品の URL を開いたら、画面が固まったぞ。怖いからどうにかしてくれ」


再現してみると、原因はすぐ分かります。

JavaScript

const item = items.find((i) => i.id === Number(req.params.id)); res.json({ id: item.id, name: item.name });

find は見つからないと undefined を返します。その undefined に対して .id を読もうとするので、そこで例外が飛びます。応答を返さないまま処理が止まるので、松田さんの画面は待ち続けたわけです。

直し方は、読む前に確かめることです。

JavaScript

if (!item) { return res.status(404).json({ error: "商品が見つかりません" }); }

return を付けるのを忘れないでください。付け忘れると処理が下へ続き、結局 undefined を読みに行きます。返したらその場で抜けるのが変更系でも共通の形です。

404 は失敗の報告に見えますが、そうではありません。「探したけれど無かった」という事実を正しく伝えているだけです。落ちて何も返さないより、はるかに誠実な応答です。

完成条件

GET /items/:id を、見つからないときに落ちない形に直してください。

見つかったときは {"id":1,"name":"レザースニーカー","price":4800} を 200 で、見つからないときは {"error":"商品が見つかりません"} を 404 で返します。

パスから届く id は文字列なので、数値に直してから比べてください。

要件

  1. find の結果が undefined のときに 404 と {"error":"商品が見つかりません"} を返す
  2. 404 を返したらその場で抜ける(return を付ける)
  3. 見つかったときは id name price の3つを返す

入出力例

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":"商品が見つかりません"}" request("GET", "/items/abc") → "404 {"error":"商品が見つかりません"}"

ヒント

前のヒントを開くと次が開きます。開かずに解けると未開封クリアです

`find` は見つからないと `undefined` を返します。その `undefined` に `.id` を読みに行くのが原因です

ヒント 2ヒント 1 を開くと読めます
ヒント 3ヒント 2 を開くと読めます
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/08/10

関連レッスン

  • #104 検索に並び替えとページングを

    安い順に少しずつ見られるよう、並び替えと件数の指定を受け取ります。

  • #105 0円出品が通ってしまう

    タイトル必須と価格の下限を確かめ、不正な出品を400で止めます。

  • #106 調査用のアクセスログを

    全リクエストのメソッドとパスを記録するミドルウェアを自作します。

  • #107 エラーの形式がバラバラ

    バラバラだったエラー応答を、共通ハンドラで1つの形に統一します。

main.js
学習モード
エディタを読み込んでいます

メモ

#103 消えた商品を開くと落ちる

⌘S で保存