express-resourceを使って効率よくREST APIを実装できるようにするためのexprestというnodeパッケージをNPMで公開してみた。と言っても、リリースしたのは2ヶ月も前の話。使い方などはREADME.mdに英語で書いておいたが、英語が苦手な人のために日本語の対訳を書いておこう。
設計編からだいぶ間があいてしまったが、routes/auth.js
に枠組みだけ作ったauth
モジュールの実装を埋めていこう。
スタート地点はこの段階。
module.exports = function(models) { var User = models.user; return { signup: function(req, res) { } , login: function(req, res) { } , logout: function(req, res) { } }; };
Sequelizeを使う準備が整ったところで、どんなWebアプリを作るにしても避けて通れないであろうユーザー認証の仕組みを実装していく。
大まかな流れはこんな感じ。
User
モデルを定義する- 認証モジュールを設計する
- リクエストのルーティングを追加する
- 認証モジュールを実装する
7月20日に催されたJTPAギークサロン「青木淳氏とNode.js/Herokuを体験する」にボランティアのテクニカルサポートスタッフとして参加してきた。JTPAでのハッカソンは、Hadoopで始める並列データ解析以来。参加者は各々ラップトップを持ち込み(参加者の9割がMacというのがシリコンバレーらしい)、ガイドに従いながらプログラムを書いていくわけだが、Hadoopの時と同様に参加者のプログラミングスキルはバラバラ。自分でWebサービスを作ったことがある人もいれば、プログラムを書いたことがないという初心者もいたけれど、ホスト役の青木氏の素晴らしいファシリテーションで、時間内に全員が「heroku上でMySQLを使ったnodeアプリを動かす」というゴールに辿り着くことができた。
それでは中編で棚上げしていたsync
メソッドを提供するAPIの実装を書いていこう。
Sequelizeのサンプルを見てもわかるように、sync
メソッドはimport
メソッドによってインスタンス化されたモデルオブジェクトに対する呼び出し(Project.sync
)と、Sequelize
オブジェクトに対する呼び出し(sequelize.sync
)の2パターンある。モデルオブジェクトに対してsync()
を実行すると、対応するテーブル定義だけが構築される。 Sequelizeオブジェクトに対してsync()
を実行すると、データベース全体が構築される。また、sync()
の引数に{ force: true }
を渡すと、既存のテーブルを一旦削除(DROP)してゼロからテーブルを作り直す(再構築)。
前編では、Sequelizeをインスタンス化するために自前でdbconn
モジュールを作って、app.js
はこんな感じにシンプルに書けるようになった。
var express = require('express') , resource = require('express-resource') , config = require('config') , sequelize = require('dbconn')(config) , app = module.exports = express.createServer(); app.resource('users', require('./routes/users'), { id: 'id' });
実際にSequelizeを使ってDBに対するCRUD操作を行うAPIの実装を書く以前に、まだDBすら存在しないのでmysql
コマンドでDBだけ作っておく。
MVCアプリケーションを作る際、コントローラ(C)とビュー(V)は前回紹介したexpress-resourceが面倒を見てくれる。REST APIの場合はビューと呼ぶほどのものではないが、APIの出力形式をXML、JSONと複数対応するにはコンテントネゴシエーションが強力なビュー機能を提供してくれると言える。
さて、今回はモデル(M)に相当する部分を作る際に欠かせないSequelizeを紹介しよう。 Sequelizeを使うと、DBのスキーマやデータを、node.jsアプリケーション内でJavaScriptオブジェクトとして扱えるようになる。いわゆるO/Rマッパーを実現してくれる。MySQL、SQLite、 PostgreSQLと主なオープンソースのRDBMSはサポートされており、RDBMS毎に微妙に異なるSQLの方言などを吸収してくれるので、仮に開発過程でRDBMSを乗り換えることがあったとしても、アプリ側のコードに大掛かりな修正が生じなくて済む。
「node.jsを使って簡単にWebアプリが作れる!」みたいな記事で紹介されているサンプルコードは、だいたいそのまま使いものにならないことが多い。実際のアプリ開発では、いろいろなモジュールをNPMでインストールして、ソースコードツリーの階層なんかにも気を配ったりするものだ。DBへのアクセスも一元化して、O/Rマッパーも使えるようにしたい。国際化対応も考えなければならない。デバッガも必要だ。アプリを作りながら後付していくのもいいが、最初の段階である程度は固めておきたいと思う人も多いだろう。
すべてを一気に紹介すると相当長くなりそうなので、今回はREST APIを作る上で欠かせないexpressとexpress-resourceに焦点を当てる。node.jsとNPMをまだインストールしていなかったらnvmでインストールしておこう。
node.jsはソースコードに加えて、Windows版、Mac版のインストーラが用意されているが、なにせnode.jsは今のなお開発進行形で頻繁にバージョンアップがされており、その都度アンインストール/再インストールするのは非常に面倒だ。node.jsはRubyの影響を強く受けているのか、RVM(Ruby Version Manager)と同じようなNVM(Node Version Manager)というバージョン管理システムが用意されている。開発環境としてはNVMを利用してnode.jsを自動インストールする方が便利だ。