Express と SQLite を使って REST API サーバを作ってみた

ExpressREST API を構築、SQLiteデータ永続化を実現して、Node.js オンリーで Web API サーバを作ってみた。

作成したソースコード一式が置いてある GitHub リポジトリは以下。

以降、このリポジトリのソースコードの使い方とか、構造の説明とか、作成に至るまでの話とか。

目次

このソースコードの使い方

この REST API サーバは Node.js・npm オンリーで作ったので、上述の GitHub リポジトリを git clone したら、$ npm install するだけでサーバとして動作するようになる。

$ npm install
$ npm start

サーバ起動 : http://localhost:3000/

コレだけ。

サンプルとして、ユーザ情報を扱う Users という API を用意している。それぞれ、以下のメソッド・URL を指定して参照・操作できる。

機能 メソッド URL
全件取得 GET http://localhost:3000/api/users/
ID を指定して1件取得 GET http://localhost:3000/api/users/1
新規登録 POST http://localhost:3000/api/users/
ID を指定して更新 PUT http://localhost:3000/api/users/1
ID を指定して削除 DELETE http://localhost:3000/api/users/1

./test/ 配下に、これらの API を叩く Node.js スクリプトが置いてあるので、$ npm start でサーバ起動後、以下のコマンドを試しに実行してみてほしい。

GET 系なら、ブラウザ上で http://localhost:3000/api/users/ に直接アクセスすることで、JSON 形式のレスポンスが返ってくることが確認できるはずだ。

構造

このサーバのディレクトリ構成は以下のとおり。

node-js-rest-api-sqlite-db/
├ README.md                    説明ファイル
├ package.json                 利用する npm パッケージなどの情報
├ index.js                     エントリポイント。サーバの起動と DB の準備を行う
├ app/                         サーバ・DB を動作させるためのファイルは全てこの中
│ ├ db/                       DB (SQLite) 関連のファイルを置くディレクトリ
│ │ ├ db.js                  DB ファイルの生成とテーブル定義の準備を行う
│ │ └ sqlite3-database.db    サーバを起動すると db.js により生成される
│ ├ routes/                   ルータ関連のディレクトリ
│ │ ├ router.js              API 別のルータの登録などを行うベースルータ
│ │ └ users-router.js        Users に関するルーティングの定義
│ ├ controllers/              ルータから呼ばれるコントローラクラスを置くディレクトリ
│ │ ├ controller.js          各コントローラクラスで共通的に利用する処理をまとめたクラス
│ │ └ users-controller.js    Users に関するコントローラ
│ ├ models/                   DB 接続を行うクラス (DAO) を置くディレクトリ
│ │ ├ model.js               各モデルクラスで共通的に利用する処理をまとめたクラス
│ │ ├ model-error.js         DB 操作時のエラー情報を保持するためのオブジェクト
│ │ └ user-model.js          Users に関するモデル
│ └ entities/                 コントローラ・モデル間でデータをやり取りする際のクラス (DTO) を置くディレクトリ
│    └ user-entity.js         Users に関するエンティティ
└ test/                        サーバにリクエストを投げてテストするための Node.js スクリプト
   ├ user-find-all-test.js     Users の全件取得を行う
   ├ user-find-by-id-test.js   Users の ID を指定して1件取得を行う
   ├ user-create-test.js       Users にデータを新規登録する
   ├ user-update-test.js       Users のデータを更新する
   └ user-delete-test.js       Users のデータを削除する

index.js がエントリポイント。サーバを起動し、db.js にDB ファイルを用意させ、router.js を呼び出してルーティングの定義を行わせる。

特定の URL にアクセスすると、Router から Controller が呼び出される。Controller でリクエスト情報が整理され、DB 操作を行う Model クラスが呼び出される。Controller と Model 間のデータやり取りのために、Entity クラスを利用している。

Users 以外の API を作る場合は、

を用意することで、Users と同じように動作させられる。

作成に至るまでの雑記

JSON-Server で簡易 API サーバを構築してみたり、Rails5 の API モードを触ってみたりして、ふと「REST API と DB 操作を Node.js だけで完結できないか」と思い立ち、作り始めた。

Node.js でサーバを構築するには Express というツールがよく使われていて、名前は知っていたが使ったことはなかったので、今回色々調べながら作ってみた。

DB の方は、以前紹介した node-sqlite3 を使えば SQLite DB がサクッと作れると思い、コレを使うことにした。

で、「Express + SQLite」といったキーワードで調べてみると、色々と先人の情報が出てきた。

さらには SQLite を利用した WebAPI をうまいこと構築してくれる npm パッケージも見付けた。日本語 README なのが嬉しい。

ただ、コチラは RESTful な API の URL 設計にはなっていなかったので、作りだけ参考に、まずは Rails の Scaffold で作れる構成を真似て自作することにした。

もう少し調べてみると、自分がやりたいことをまさに実現しているリポジトリを見付けた。

今回自分が作ったサンプルコード群は、ほとんどこのリポジトリが元ネタになっている。一部ディレクトリ構成やメソッド等を簡略化させている。

Express の操作はまだまだ見様見真似で、体系的に覚えられていない。SQLite の操作に関しても、SQLite の方言に関する知識も怪しかったり、node-sqlite3 の API も理解しきっていない感じ。それでもとりあえずは思ったような CRUD 操作ができるようになったので、コレでよしとする。

何かコードに問題があればご指摘いただきたい…。

その他参考にした記事↓