1. id が 1 の商品を取り出す
  2. id が 2 の商品を取り出す
  3. 無い id なら null
  4. 商品が無いときも null
コース一覧
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章で作ったデータ層は、JSON ファイルに全件を書き戻す形でした。商品が数十件ならこれで動きます。

ですが問題が出てきます。

  • 1 件足すだけでも全件を読み書きする
  • 「価格が 3000 円以上」を探すには全件を自分で調べる
  • 2 人が同時に出品すると、片方の書き込みが消える

データベースは、この 3 つをまとめて解決するために作られたものです。

このコースで使うもの

Node.js 22 には、SQLite というデータベースが最初から入っています。npm で何かを入れる必要はありません。

JavaScript

const { DatabaseSync } = require("node:sqlite"); const db = new DatabaseSync(":memory:");

:memory: は「メモリの中に作る」という指定です。プログラムが終われば消えます。ファイル名を渡せば、そのファイルに残ります。

実務では PostgreSQL や MySQL を使うことが多いのですが、SQL の書き方はほとんど同じです。ここで身につけたことはそのまま使えます。

表を用意する

データベースには、まず入れ物の形を教えます。

JavaScript

db.exec(` CREATE TABLE items ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, price INTEGER, sold INTEGER DEFAULT 0 ) `);

AUTOINCREMENT は、第4章で自分で書いた「最大の id + 1」を、データベースが代わりにやってくれる指定です。DEFAULT 0 は、指定しなければ 0 が入るという意味です。

3つの呼び出し方

SQL を実行する方法は、返ってくるものによって分かれます。

書き方返るもの使う場面
db.exec(sql)何も返らない表を作る、まとめて流す
db.prepare(sql).get(...)1 行1 件だけ取る
db.prepare(sql).all(...)行の配列一覧を取る
db.prepare(sql).run(...)実行結果書き込む

get は見つからなければ undefined、all は見つからなければ空の配列を返します。第4章で「1 件は 404、一覧は空配列」と決めたことに、そのまま対応します。

手を動かす

演習では、データベースにつないで表を作り、1 件取り出すところまでを書きます。まずは往復できることを確かめてください。

要件

  1. node:sqlite の DatabaseSync でメモリ上のデータベースを作る
  2. items 表を id INTEGER PRIMARY KEY name TEXT price INTEGER の形で作る
  3. 受け取った商品を入れ、指定された id の商品を {id, name, price} の形で返す(無ければ null)

入出力例

setupAndFetch([{"id":1,"name":"レザースニーカー","price":4800},{"id":2,"name":"古着のデニムジャケット","price":6200}], 1) → {"id":1,"name":"レザースニーカー","price":4800} setupAndFetch([{"id":1,"name":"レザースニーカー","price":4800},{"id":2,"name":"古着のデニムジャケット","price":6200}], 2) → {"id":2,"name":"古着のデニムジャケット","price":6200} setupAndFetch([{"id":1,"name":"レザースニーカー","price":4800}], 999) → null setupAndFetch([], 1) → null

ヒント

表を作るのは `db.exec("CREATE TABLE ...")` です

同じ INSERT を何度も使うので、`db.prepare(...)` を先に 1 回だけ作って `run` を繰り返します

1 件取り出すのは `.get(id)` です。見つからないと `undefined` が返るので、そこで `null` を返します

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

関連レッスン

  • 一覧・詳細をDB化

    商品一覧をDB読みに置き換え、ファイルからDBへ移行できるようになります。

  • 出品をDB化

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

  • SQLインジェクション

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

  • 更新・削除をDB化

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

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

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

  • applicationJSON 本文を送るときの Content-Type
  • データベースデータを構造化して保存する仕組み
  • Node.jsJavaScript をサーバ側で動かすランタイム
  • メモリプログラムとデータを一時保持する高速領域
  • PostgreSQL機能が豊富なオープンソースのRDBMS
  • MySQL広く使われるオープンソースのRDBMS
  • SQLデータベースを操作するための共通言語
  • 配列サイズ固定の同型データの集まり
main.js
学習モード
エディタを読み込んでいます

メモ

DBにつなぐ

⌘S で保存