「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 コメント