yutaponのブログ

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

express4でRESTful API作る

ちょっとnode.jsでAPIサーバ作ろうとして
express4に上げたらいろいろと使い方が変わっていたので
備忘録的に書いておきます。


expressでのプロジェクトの作り方

ここを見ながらやるのが確実。
https://www.npmjs.org/package/express
 

express3の場合

express3までは

$ npm install -g express # グローバルにexpressコマンド入れて
$ express appName  # expressコマンドでひな形作成
..

$ node app.js  # アプリケーション起動

こんな感じでexpressプロジェクトを作れましたが、
express4から結構変更されています。


express4の場合

express4ではひな形を作るコマンドが本体から分離されました。
またアプリケーションの起動方法も変更されてます。

$ npm install -g express-generator  # これ入れるとexpressコマンドが使えるようになる
$ cd path/to/workspace
$ express -e -c stylus appName # ejs, stylus有効にしてappNameプロジェクトを作成
.. # ひな形が作成される

$ npm install # package.jsonに記述されてる依存モジュールを入れる
..

$ npm start # アプリケーション起動

 
npm startってなに??となるかもしれないですが、
package.jsonのscriptsに書いてあるシェルが実行されてます。

scriptsにはこんな記述があります。

  "scripts": {
    "start": "node ./bin/www"
  },

 
つまり、以下の記述は同じ意味になります。

$ npm start
$ node ./bin/www

 

では ./bin/wwwにはどんな記述があるかというと、

#!/usr/bin/env node
var debug = require('debug')('my-application');
var app = require('../app');

app.set('port', process.env.PORT || 3000);

var server = app.listen(app.get('port'), function() {
  debug('Express server listening on port ' + server.address().port);
});

 
実際にサーバーを立ちあげているみたいです。


nodeコマンドでサーバーを立ち上げると、ファイルを変更したらプロセスを落として、再起動して反映させるという面倒なことをしないといけないので開発時はあまりやりたくありません。


そういうときは

  • "start": "node-dev ./bin/www" とかに起動コマンドを変更する
  • $ node-dev ./bin/www とかで起動する

などで対応すれば良さそうです。


いつもnode-dev使ってましたが、今使うならsupervisorの方が良さ気ですね。開発者がisaacs氏ですし。
isaacs/node-supervisor · GitHub
fgnass/node-dev · GitHub


Express4でRESTful API作る

express3ではexpress-resourceというモジュールを使ってRESTfulAPIを作りました。
node.jsでRESTful API作る - yutaponのブログ

しかしexpress4だとこのモジュールが動かないようなので、自前で作ったほうが早そうです。
(express-resourceにexpress4対応のPullReqを送るチャンス)


express-resourceを使わないRESTfulAPIの作り方はこちらを参考にしました。
Creating a REST API using Node.js, Express, and MongoDB | Christophe Coenraets


試しにapp.jsのルーティング部分にあるusersを以下のように変更します。

app.get('/users', users.index);
app.get('/users/:id', users.show);
app.post('/users', users.create);
app.put('/users/:id', users.update);
app.delete('/users/:id', users.destroy);

 
見て分かるとおり、GET, POST, PUT, DELETEによってusersモジュールから呼び出すメソッドを変えてます。


usersモジュールではこんな感じで処理を組めば良さそうです。

// @file user.js <routes>

module.exports = {
    index : function (req, res) {
        var users = {};
        // TODO: findByAll 実装する
        res.send(users);
    },
    show : function (req, res) {
        var user = {};
        // TODO: findById 実装する
        res.send(user);
    },
    create : function (req, res) {
        var user = {};
        // TODO: insert 実装する
        res.send(user);
    },
    update : function (req, res) {
        var user = {};
        // TODO: update 実装する
        res.send(user);
    },
    destroy : function (req, res) {
        var user = {};
        // TODO: delete 実装する
        res.send(user);
    },
};

 

ルーティング部分をapp.jsに書いていくとapp.jsが肥大化していくので
express-resourceみたいなラッパーを作って切り出したいところ。

たぶんそんなに難しくないはず。


REST Client

ブラウザのURL欄を使ってデバッグするとGETくらいしか試せないので、
ChromeAppのPostmanっていうクライアントを入れると確認が捗ります。

Chrome Web Store - Postman - REST Client


これ入れるとGET, POST, PUT, DELETE, etc.. を試すことができるのでおすすめ。


おわりに

express-resource使わなくても簡単につくれた。
永続化はMongoDBが簡単で良さそう。

いまちょっとしたアプリケーションを作ろうと思ってるので、
完成したらまた報告します。