「node.jsを使って簡単にWebアプリが作れる!」みたいな記事で紹介されているサンプルコードは、だいたいそのまま使いものにならないことが多い。実際のアプリ開発では、いろいろなモジュールをNPMでインストールして、ソースコードツリーの階層なんかにも気を配ったりするものだ。DBへのアクセスも一元化して、O/Rマッパーも使えるようにしたい。国際化対応も考えなければならない。デバッガも必要だ。アプリを作りながら後付していくのもいいが、最初の段階である程度は固めておきたいと思う人も多いだろう。
すべてを一気に紹介すると相当長くなりそうなので、今回はREST APIを作る上で欠かせないexpressとexpress-resourceに焦点を当てる。node.jsとNPMをまだインストールしていなかったらnvmでインストールしておこう。
express
node.jsでMVCアーキテクチャのアプリを作ろうと思ったら、まずはexpressをインストールして、expressでプロジェクトの最初のディレクトリを構成しよう。
$ sudo npm install -g express $ express myrest create : myrest create : myrest/package.json create : myrest/app.js create : myrest/public create : myrest/public/javascripts create : myrest/public/images create : myrest/public/stylesheets create : myrest/public/stylesheets/style.css create : myrest/routes create : myrest/routes/index.js create : myrest/views create : myrest/views/layout.jade create : myrest/views/index.jade dont forget to install dependencies: $ cd myrest && npm install
root権限でグローバルインストールしているが、ローカルインストールでも構わない。
最初の時点でのディレクトリ構成はこんな感じ。
myrest/ ├── app.js ├── package.json ├── public/ │ ├── images/ │ ├── javascripts/ │ └── stylesheets/ │ └── style.css ├── routes/ │ └── index.js └── views/ ├── index.jade └── layout.jade
ただし、純粋なREST APIを作るのであれば、views
とpublic
はまず使うことはない。
この先インストールするモジュールは、package.json
を編集して、npm install
を実行するという流れになる。expressだけをインストールした段階でのpackage.json
を見てみよう。
{ "name": "application-name" , "version": "0.0.1" , "private": true , "dependencies": { "express": "2.5.8" , "jade": ">= 0.0.1" } }
dependencies
にインストールしたいモジュールを付け足していくわけだ。
express-resource
express-resourceは、REST APIのルーティングを提供してくれる。app.js
やroutes/index.js
で、HTTPメソッドとURL、呼び出す関数のマップを自分で書かなくて済むわけだ。例えば、ユーザー情報を格納したDBがあって、それに対応するREST APIを提供する場合、routes/user.js
(またはroutes/user/index.js
)を作って、以下のようなモジュールを書くことになる。
module.exports = { index: function(req, res) { }, new: function(req, res) { }, create: function(req, res) { }, show: function(req, res) { }, edit: function(req, res) { }, update: function(req, res) { }, destroy: function(req, res) { } };
そして、app.js
で以下のコードを追加する。
var express = require('express') , resource = require('express-resource') , app = module.exports = express.createServer(); app.resource('users', require('./routes/user'), { id: 'id' });
routes/user.js
で実装したモジュールの各メソッドは、express-resourceが以下のようにHTTPメソッドも含めてマップしてくれる。
GET /users -> index GET /users/new -> new POST /users -> create GET /users/:id -> show GET /users/:id/edit -> edit PUT /users/:id -> update DELETE /users/:id -> destroy
app.resource()
の第3引数で、リソースのキーとなるプレースホルダー名をid
と指定しているため、上記のようなマップになっているが、第3引数を省略すると第1引数の単数形がデフォルトで使われる。例えば、user.show()
に対応するURLは、/users/:user
になるわけだ。
express-resourceはコンテントネゴシエーションなんて気の利いたものまで用意されている。例えば、/users.json
にリクエストを投げるとJSON形式で、/users.xml
にリクエストを投げるとXML形式で結果を返してくれるようなREST APIを簡単に提供できるようになる。
順番が逆になってしまったが、express-resourceをインストールするには、packege.jsonをまずは編集。
{ "name": "application-name" , "version": "0.0.1" , "private": true , "dependencies": { "express": "2.5.8" , "express-resource": "latest" , "jade": ">= 0.0.1" } }
あとはnpm install
を実行するだけ。
1 コメント