前回までの記事で環境の整備を行いました
CentOS7.2にNode.js環境を構築する
Node.js+Express経由でSQLite3にデータ登録する
今回は、WebAPIを作成して、以下の動きを実現します。
「リクエスト→Node.js→SQLite3→Node.js→レスポンス」
#バージョン確認と、事前作業
バージョンの確認と、expressコマンドを利用可能にします
[am@Alnilam app]$ node -v
v4.4.2
[root@Alnilam ~]$ npm install -g express-generator
[am@Alnilam app]$ express -V
4.13.1
#Node.jsでAPIを作成する
expressコマンドで、アプリの雛形を作成する
コマンドで作成する。frenjyは適当にキーボードを叩いた文字列です。
[am@Alnilam ~]$ express frenjy
create : frenjy
create : frenjy/package.json
create : frenjy/app.js
create : frenjy/public
create : frenjy/public/javascripts
create : frenjy/public/images
create : frenjy/public/stylesheets
create : frenjy/public/stylesheets/style.css
create : frenjy/routes
create : frenjy/routes/index.js
create : frenjy/routes/users.js
create : frenjy/views
create : frenjy/views/index.jade
create : frenjy/views/layout.jade
create : frenjy/views/error.jade
create : frenjy/bin
create : frenjy/bin/www
install dependencies:
$ cd frenjy && npm install
run the app:
$ DEBUG=frenjy:* npm start
自動生成したアプリにモジュールを追加して起動する
他の言語でいう、ライブラリ・パッケージの管理に当たるものらしい。モジュールの設定はアプリ直下の「package.json」に書いています。
[am@Alnilam ~]$ cd frenjy/
[am@Alnilam frenjy]$ npm install
[am@Alnilam frenjy]$ npm start
#開発時は、アクセス時に最新を取り直してほしいので、以下オプション追加
[am@Alnilam frenjy]$ npm start -g node-dev
ブラウザでアクセスする
アプリのテンプレート作成、起動が確認できました。続いてAPIを作成します。
#作成したいAPIの情報(仕様、テーブル)
主なAPIの仕様は以下の通り
・ユーザテーブルに登録されたレコード全件をJSONの形で取得
・HTTPメソッド:GET
このAPIでアクセスするテーブル
sqlite> .schema user
CREATE TABLE user (
id INTEGER NOT NULL PRIMARY KEY,
name TEXT NOT NULL,
description TEXT
);
#APIの作成
実際にAPIを作成していきます
APIの記述
Expressの恩恵や共通化の概念をほぼ無視して、まずAPIを記述
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var sqlite3 = require('sqlite3')
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
var port = process.env.PORT || 3000;
var router = express.Router();
app.get('/', function(req, res) {
var db = new sqlite3.Database('sample');
db.serialize(function() {
db.all('SELECT id,name FROM USER', function(err, rows) {
res.json(rows);
});
});
db.close();
});
app.listen(port);
レスポンス
[
{"id":1,"name":"name1"},
{"id":2,"name":"name2"}
]
最近のフレームワークでは、上のようにres.json()という書き方をするだけで、jsonの形式に整形してくれて凄く楽になりました。当然ですが、フレームワークが請け負ってくれている処理はきちんと把握しなければと思います。今回は、Node.jsからDBを参照して、jsonの文字列を返すAPIを作成しました。今後は、DB接続部分の共通化や、DI整形などきちんと整備したいと存じます。