yutaponのブログ

javascript界隈の興味あるネタを備忘録的に残しておく場所

node.jsでRESTful API作る

node.js触るのは5ヶ月ぶりくらいなのでリハビリも兼ねて。

まだRESTなAPI作ったこと無いな・・
ということで、アプリケーションサーバとしてnode.jsを選んだときに
RESTfulなAPIを返すサーバを作ってみます。

ちなみにほぼ
node.jsでREST APIを作るのに最適なexpress-resource | Inhale n' Exhale
の内容に沿ってますハイ。


【追記】
express4版はこちら。
express4でRESTful API作る - yutaponのブログ
 

express-resourceをインストール

前回express3でMVCのひな形を作ったので、
それにのっかる形で作っていきます。

express-resourceを使うと簡単にできそうです。
https://github.com/visionmedia/express-resource

express-resourceをインストールします。

$ npm install --save express-resource


npm install するときは--saveオプションを付けると
package.jsonのdependenciesに自動で追記してくれるので便利です。

--save-devオプションを付けるとdevDependenciesに
追記されます。デバッグ用のモジュールなどはこちらを付けましょう。

app.jsを編集

インストールしたらapp.jsを編集します。

var express = require('express')
  , resource = require('express-resource')  // 追加
  , routes = require('./routes')
  , user = require('./routes/user')
  , http = require('http')
  , path = require('path');

var app = express();

// いろいろ設定があって・・

app.get('/', routes.index);
//app.get('/users', user.index);  // ←これが、↓こう変わる
app.resource('users', require('./routes/user')); // 追加

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

routes/user.jsを編集

デフォルトで書かれていたものを消して、下記のように書き換えました。

module.exports = {
   index: function(req, res){
    res.send("index: called as GET method");
  }
  ,new: function(req, res){
    res.send("new: called as GET method");
  }
  ,create: function(req, res){
    res.send("create: called as POST method");
  }
  ,show: function(req, res){
    res.send("show: called as GET method");
  }
  ,edit: function(req, res){
    res.send("edit: called as GET method");
  }
  ,update: function(req, res){
    res.send("update: called as PUT method");
  }
  ,destroy: function(req, res){
    res.send("destroy: called as DELETE method");
  }
};

この時点で試せるようになっているはずなので
サーバーを起動していろいろ試してみて下さい。

$ node app.js


それぞれのメソッドは、下記のURLスキームと一致します。

GET     /users              ->  index
GET     /users/new          ->  new
POST    /users              ->  create
GET     /users/:user          ->  show
GET     /users/:user/edit     ->  edit
PUT     /users/:user          ->  update
DELETE  /users/:user          ->  destroy

ブラウザのURL欄から、http://localhost:3000/users/123とアクセスしたら
routes/user.jsのshowメソッドが呼ばれます。
この時、showメソッド内ではユーザIDを参照したいわけですが、

req.params.userで123の部分を取得することができます。

userって参照名が分かりにくい場合は、app.jsのresourceの第三引数を指定しましょう。

app.resource('users', require('./routes/user'), { id: 'id' });  // 第三引数を追記

これで、req.params.idで指定されたidを取得することが出来ます。

JSON形式でレスポンスを返す

今時のAPIJSONで返すのがデフォ。
GithubのREADME見ると、JSONXMLとで動的に変える方法が載ってるけど、
今回はJSONに絞る。

app.js の resourceの第三引数に追記する。

app.resource('users', require('./routes/user'), {
   id     : 'id'
  ,format : 'json'  // 追記
});

あとはres.sendするときにJSONオブジェクトを返すようにするだけ。

たとえば、/user/123でアクセスされたら

res.json({
   "status": 200
  ,"id": 123
  ,"name": yutapon
});

みたいな感じでレスポンスを返すようにする。

おわりに

これでRESTfulなAPIを作る準備が整いました。

今のところチャットとかTODOとか簡単なものを作ろうとしてますが、
たどり着くのはまだまだ先になりそうです。

これからアプリのロジックを組んでいく前に、
まずはテスト環境を整えます。

という訳で、次回はtestem使ってテスト回です。