6月 102012
 

node.jsでREST APIを作るのに最適なexpress-resource | Inhale n’ Exhale「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を作るのであれば、viewspublicはまず使うことはない。

この先インストールするモジュールは、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.jsroutes/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 コメント

 返信する

以下のHTML タグと属性が利用できます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください