コース一覧
    Node.jsバックエンド実践
    一覧・詳細をDB化

    Node.jsバックエンド実践

    入力検証、ミドルウェア、エラー処理、データベース接続を学び、実用的なバックエンドAPIを安全に組み立てられるようにします。

    1
    リクエスト処理と検証
    01. クエリパラメータ15分
    02. 並び替えとページング15分
    03. 入力検証15分
    04. ミドルウェア15分
    05. エラーハンドリング15分
    06. つくる:検索API完成20分
    07. 第5章クイズ10分
    2
    データベース接続
    01. DBにつなぐ15分
    02. 一覧・詳細をDB化15分
    03. 出品をDB化15分
    04. SQLインジェクション20分
    05. 更新・削除をDB化15分
    06. 購入トランザクション20分
    07. つくる:DB版fleama20分
    08. 第6章クイズ10分

    一覧・詳細を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 だけにする

    ヒント

    一覧は `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 で保存