1. id が 1 の商品
  2. id が 2 の商品
  3. 無い id は404
コース一覧
Node.js入門
1件を返す

Node.js入門

Node.jsの実行モデル、npm、Expressによるルーティング、REST API設計、データベース接続、トランザクションを使った購入処理、トークン認証まで、バックエンド開発の基礎を、毎レッスン実際にコードを書き、フリマアプリのAPIを自分の手で作りながら学びます。

1
Node.jsとは
01. Node.jsとは15分
02. スクリプトを実行する15分
03. npmとは15分
04. package.json15分
05. npmスクリプト15分
06. つくる:プロジェクト始動20分
07. 第1章クイズ10分
2
モジュールと非同期の復習
01. import/export15分
02. ファイルを読み書きする15分
03. async/await復習15分
04. JSONの取り回し15分
05. つくる:データ層20分
06. 第2章クイズ10分
3
はじめてのサーバー
01. サーバーとリクエスト15分
02. Expressを導入する15分
03. ルーティング15分
04. JSONを返す15分
05. 開発の回し方15分
06. つくる:サーバー始動20分
07. 第3章クイズ10分
4
REST APIのきほん
01. RESTの考え方15分
02. 一覧を返す15分
03. 1件を返す15分
04. 登録を受ける15分
05. 更新と削除15分
06. ステータスコード15分
07. つくる:商品CRUD完成20分
08. 第4章クイズ10分
5
リクエスト処理と検証
01. クエリパラメータ15分
02. 並び替えとページング15分
03. 入力検証15分
04. ミドルウェア15分
05. エラーハンドリング15分
06. つくる:検索API完成20分
07. 第5章クイズ10分
6
データベース接続
01. DBにつなぐ15分
02. 一覧・詳細をDB化15分
03. 出品をDB化15分
04. SQLインジェクション20分
05. 更新・削除をDB化15分
06. 購入トランザクション20分
07. つくる:DB版fleama20分
08. 第6章クイズ10分
7
認証のきほん
01. 認証と認可15分
02. パスワードハッシュ15分
03. ログインとトークン15分
04. 保護ルート15分
05. 本人のものだけ15分
06. つくる:認証完備20分
07. 第7章クイズ10分
8
総合制作
01. fleama API完成20分
02. Reactと接続する20分
03. サーバーで常駐させる20分
04. 自由拡張20分
05. 完成と次のステップ15分

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 を作ります。見つからないときの扱いまで含めて書いてください。

要件

  1. GET /items/:id はその id の商品を id name price の形で返す
  2. 見つからないときは 404 で {"error":"商品が見つかりません"} を返す
  3. パスから来る 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":"商品が見つかりません"}"

ヒント

初期コードは `req.params.id` を文字列のまま比べているので、1 件も見つかりません

`Number(req.params.id)` で数値に直してから比べます

見つからなかったときは `return res.status(404).json(...)` で、その場で抜けます

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

関連レッスン

  • 登録を受ける

    出品APIを書き、作成したときに201を返せるようになります。

  • 更新と削除

    商品編集と取下げのAPIを書き、変更系を実装できるようになります。

  • ステータスコード

    各APIの返却コードを整え、状況に応じた番号を返せるようになります。

  • つくる:商品CRUD完成

    一通りのCRUDを通しで動かし、商品まわりのAPIを完成できるようになります。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 設計何をどう作るかを決める前工程
  • ルーティングURLパスとHTTPメソッドに応じて処理を振り分ける仕組み。
  • URLページの住所全体
  • クエリパラメータURL の `?` 以降に付ける `key=value` 形式のリクエストデータ
  • 処理計算や代入を表す長方形
  • リクエストWeb 通信の基本単位、ブラウザの問い合わせとサーバーの返答
  • エンドポイント「この URL を叩くとこの機能が動く」入口の住所
  • APIアプリ間でデータをやり取りする窓口
main.js
学習モード
エディタを読み込んでいます

メモ

1件を返す

⌘S で保存