Express と SQLite を使って REST API サーバを作ってみた
Express で REST 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
でサーバ起動後、以下のコマンドを試しに実行してみてほしい。
- 全件取得 :
$ node ./test/user-find-all-test.js
- ID を指定して1件取得 :
$ node ./test/user-find-by-id-test.js
- 新規登録 :
$ node ./test/user-create-test.js
- ID を指定して更新 :
$ node ./test/user-update-test.js
- ID を指定して削除 :
$ node ./test/user-delete-test.js
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 を作る場合は、
db.js
…CREATE TABLE
文の追加- Router … API 別のルータの作成と
router.js
への追加 - Controller … 共通処理は
controller.js
を利用 - Model … 共通処理は
model.js
を利用 - Entity
を用意することで、Users
と同じように動作させられる。
作成に至るまでの雑記
JSON-Server で簡易 API サーバを構築してみたり、Rails5 の API モードを触ってみたりして、ふと「REST API と DB 操作を Node.js だけで完結できないか」と思い立ち、作り始めた。
Node.js でサーバを構築するには Express というツールがよく使われていて、名前は知っていたが使ったことはなかったので、今回色々調べながら作ってみた。
DB の方は、以前紹介した node-sqlite3 を使えば SQLite DB がサクッと作れると思い、コレを使うことにした。
で、「Express + SQLite」といったキーワードで調べてみると、色々と先人の情報が出てきた。
- 参考 : Node.js, Express, and SQLite to wrap a REST API around an SQL database · GitHub
- 参考 : Node.js+Express経由でSQLite3にデータ登録する - Qiita
- 参考 : Node.jsでWebAPI作成(Express + SQLite3) - Qiita
- 参考 : Node.js + Express で WebAPI を作る - galife
さらには SQLite を利用した WebAPI をうまいこと構築してくれる npm パッケージも見付けた。日本語 README なのが嬉しい。
ただ、コチラは RESTful な API の URL 設計にはなっていなかったので、作りだけ参考に、まずは Rails の Scaffold で作れる構成を真似て自作することにした。
もう少し調べてみると、自分がやりたいことをまさに実現しているリポジトリを見付けた。
今回自分が作ったサンプルコード群は、ほとんどこのリポジトリが元ネタになっている。一部ディレクトリ構成やメソッド等を簡略化させている。
Express の操作はまだまだ見様見真似で、体系的に覚えられていない。SQLite の操作に関しても、SQLite の方言に関する知識も怪しかったり、node-sqlite3 の API も理解しきっていない感じ。それでもとりあえずは思ったような CRUD 操作ができるようになったので、コレでよしとする。
何かコードに問題があればご指摘いただきたい…。
その他参考にした記事↓
- 参考 : express実践入門 · GitHub
- 参考 : SQLite入門