#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 は文字列なので、数値に直してから比べてください。
要件
findの結果がundefinedのときに 404 と{"error":"商品が見つかりません"}を返す- 404 を返したらその場で抜ける(
returnを付ける) - 見つかったときは
idnamepriceの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":"商品が見つかりません"}"ヒント
前のヒントを開くと次が開きます。開かずに解けると未開封クリアです
ヒント 2ヒント 1 を開くと読めます
ヒント 3ヒント 2 を開くと読めます
編集 ゆめさく編集部