コース一覧
    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化

    書き込みは run で行う

    読み出しの get と all に続いて、書き込みの run を使います。

    JavaScript

    const result = db
      .prepare("INSERT INTO items (name, price) VALUES (?, ?)")
      .run("レザースニーカー", 4800);

    ? の場所に、run に渡した値が順番どおりに入ります。この ? をプレースホルダと呼びます。次のレッスンで、これが単なる書き方の都合ではないことを見ます。

    id はデータベースが決める

    第4章では「最大の id + 1」を自分で計算していました。表を AUTOINCREMENT で作っておけば、その計算は要りません。

    JavaScript

    const result = db.prepare("INSERT INTO items (name, price) VALUES (?, ?)").run(name, price);
    const newId = result.lastInsertRowid;

    lastInsertRowid に、いま入った行の id が返ります。

    自分で計算しないほうが安全です。2 人が同時に出品したとき、自分で計算する方式だと両方が同じ id を掴むことがあります。データベースに任せれば、そこは正しく捌かれます。

    数として扱う

    lastInsertRowid は、とても大きな数まで扱える特別な形で返ります。そのまま JSON にすると扱いにくいので、数値に直します。

    JavaScript

    const newId = Number(result.lastInsertRowid);

    入れたものを返す

    登録の応答には、作られたものを返します。id が決まるのは登録した後なので、入れてから読み直すのが確実です。

    JavaScript

    const newId = Number(result.lastInsertRowid);
    const created = db.prepare("SELECT id, name, price FROM items WHERE id = ?").get(newId);
    res.status(201).json(created);

    手元の値から組み立てても同じに見えますが、DEFAULT 0 のようにデータベース側が決めた値は読み直さないと分かりません。

    検証は変わらず入り口で

    第5章で書いた検証は、そのまま前に残します。

    JavaScript

    if (!req.body.name) {
      return res.status(400).json({ error: "商品名は必須です" });
    }

    データベースにも制約は付けられますが、おかしな入力は入り口で止めるのが先です。400 で理由を返すほうが、送った側にとって分かりやすくなります。

    手を動かす

    演習では、出品をデータベース書き込みに置き換えます。id はデータベースに決めさせてください。

    要件

    1. name が空なら 400 で {"error":"商品名は必須です"} を返す
    2. INSERT はプレースホルダ ? を使い、id は AUTOINCREMENT に任せる
    3. 入った id で読み直した {id, name, price, sold} を 201 で返す

    ヒント

    検証の `if` を先に書き、その後で `INSERT` します

    `db.prepare("INSERT INTO items (name, price) VALUES (?, ?)").run(名前, 価格)` の形です

    `result.lastInsertRowid` を `Number(...)` に通してから、その id で読み直します

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

    関連レッスン

    • SQLインジェクション

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

    • 更新・削除をDB化

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

    • 購入トランザクション

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

    • つくる:DB版fleama

      全APIをDBで動かし、データ層を丸ごと移行できるようになります。

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

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

    • プレースホルダSQL の `?` 部分にあとから値を入れる仕組み
    • データベースデータを構造化して保存する仕組み
    • applicationJSON 本文を送るときの Content-Type
    main.js
    エディタを読み込んでいます

    メモ

    出品をDB化

    ⌘S で保存