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を作るのであれば、views
とpublic
はまず使うことはない。
この先インストールするモジュールは、package.json
を編集して、npm install
を実行するという流れになる。expressだけをインストールした段階でのpackage.json
を見てみよう。
2 | "name": "application-name" |
3 | , "version": "0.0.1" |
4 | , "private": true |
5 | , "dependencies": { |
6 | "express": "2.5.8" |
7 | , "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
)を作って、以下のようなモジュールを書くことになる。
2 | index: function (req, res) { |
4 | new : function (req, res) { |
6 | create: function (req, res) { |
8 | show: function (req, res) { |
10 | edit: function (req, res) { |
12 | update: function (req, res) { |
14 | destroy: function (req, res) { |
そして、app.js
で以下のコードを追加する。
1 | var express = require( 'express' ) |
2 | , resource = require( 'express-resource' ) |
3 | , app = module.exports = express.createServer(); |
5 | 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をまずは編集。
2 | "name": "application-name" |
3 | , "version": "0.0.1" |
4 | , "private": true |
5 | , "dependencies": { |
6 | "express": "2.5.8" |
7 | , "express-resource": "latest" |
8 | , "jade": ">= 0.0.1" |
あとはnpm install
を実行するだけ。
1 コメント