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が簡単で良さそう。
いまちょっとしたアプリケーションを作ろうと思ってるので、
完成したらまた報告します。