1. 一覧が id 順で返り、メールは含まれない
  2. SQL で価格を絞り込む
  3. 当てはまらなければ空の配列
  4. 1件を取り出す
  5. 無い id は404
コース一覧
Node.js入門
一覧・詳細をDB化

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分

一覧・詳細をDB化

呼び出す側は変えない

第2章のつくる回で、データ層を分けておいた理由がここで効きます。

プレーンテキスト

リクエスト → ルート → データ層 → 応答

差し替えるのはデータ層の中身だけです。ルートの側は、これまでどおり「一覧をください」と頼むだけで、その裏がファイルなのかデータベースなのかを知りません。

絞り込みを SQL に任せる

第5章では、全件を配列に読んでから filter で絞っていました。データベースがあれば、絞り込み自体を任せられます。

JavaScript

// これまで const found = items.filter((item) => item.price >= 3000); // これから const found = db.prepare("SELECT * FROM items WHERE price >= ?").all(3000);

違いは速さです。前者は全件を取り出してから捨てますが、後者は必要なものだけを取り出します。10 万件あるうちの 10 件がほしいとき、この差は大きくなります。

並べ替えも同じです。ORDER BY price と書けば、データベースが並べて返します。

取り出す列を選ぶ

第3章から「返すものは選ぶ」と書いてきました。SQL では取り出す段階で選べます。

JavaScript

db.prepare("SELECT id, name, price FROM items").all();

SELECT * は全部の列を持ってくる書き方です。楽ですが、ownerEmail のような外に出したくない列まで手元に来ます。必要な列だけを書くほうが、うっかり返してしまう事故を防げます。

1件と一覧で使い分ける

JavaScript

app.get("/items", (req, res) => { res.json(db.prepare("SELECT id, name, price FROM items").all()); }); app.get("/items/:id", (req, res) => { const item = db.prepare("SELECT id, name, price FROM items WHERE id = ?").get(Number(req.params.id)); if (!item) { return res.status(404).json({ error: "商品が見つかりません" }); } res.json(item); });

all は空でも配列、get は無ければ undefined です。第4章で決めた「一覧は空配列で 200、1 件は 404」に、そのまま重なります。

手を動かす

演習では、一覧と詳細をデータベース読みに置き換えます。絞り込みは SQL に任せてください。

要件

  1. GET /items は SELECT で一覧を返し、minPrice があれば WHERE price >= ? で絞る
  2. GET /items/:id は 1 件を返し、無ければ 404 で {"error":"商品が見つかりません"}
  3. 取り出す列は id name price だけにする

入出力例

request("GET", "/items") → "200 [{"id":1,"name":"レザースニーカー","price":4800},{"id":2,"name":"ランニングスニーカー","price":3200},{"id":3,"name":"古着のデニムジャケット","price":6200}]" request("GET", "/items?minPrice=4000") → "200 [{"id":1,"name":"レザースニーカー","price":4800},{"id":3,"name":"古着のデニムジャケット","price":6200}]" request("GET", "/items?minPrice=99999") → "200 []" request("GET", "/items/2") → "200 {"id":2,"name":"ランニングスニーカー","price":3200}" request("GET", "/items/999") → "404 {"error":"商品が見つかりません"}"

ヒント

一覧は `db.prepare(...).all(...)`、1 件は `db.prepare(...).get(...)` です

`minPrice` が無いときは 0 に落とすと、`WHERE price >= 0` で全件になります

`SELECT *` ではなく `SELECT id, name, price` と書けば、メールは手元にも来ません

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

関連レッスン

  • 出品をDB化

    出品APIをDB書き込みにし、安全に書き込めるようになります。

  • SQLインジェクション

    文字列連結の危険を再現してから直し、プレースホルダが必要な理由を説明できるようになります。

  • 更新・削除をDB化

    編集と取下げをDB化し、変更系を移行できるようになります。

  • 購入トランザクション

    売切れ化と購入記録を不可分にし、複数の更新を一括で処理できるようになります。

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

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

  • データベースデータを構造化して保存する仕組み
  • SQLデータベースを操作するための共通言語
  • 配列サイズ固定の同型データの集まり
main.js
学習モード
エディタを読み込んでいます

メモ

一覧・詳細をDB化

⌘S で保存