PeepCodeに学ぶ node.js+express のblankプロジェクトを作る
本ブログは東京Node学園祭2012 アドベントカレンダーの2日目の記事です。
Smashing Node.jsを私も読んでいるのですが、それより前にPeepCodeのFull Stack Node.jsを見て、node.js+expressでアプリケーションを作る時にいつも同じことをやるので、復習がてらに、blankプロジェクトを作ってみました。このブログではその内容を紹介します。
前提
node.jsは既にインストール済みであることを前提とします。また、私の環境は Mac OS X です。
expressプロジェクトの作成と必要なmoduleのインストール
ここはいつも通りです。
express blank create : blank create : blank/package.json create : blank/app.js create : blank/public create : blank/public/javascripts create : blank/public/images create : blank/public/stylesheets create : blank/public/stylesheets/style.css create : blank/routes create : blank/routes/index.js create : blank/routes/user.js create : blank/views create : blank/views/layout.jade create : blank/views/index.jade install dependencies: $ cd blank && npm install run the app: $ node app cd blank npm install
app.jsをserver.jsに名前変更
デプロイするサーバを考えると、server.jsの方が良いことが多いので、名称を変更します。
mv app.js server.js
この時、package.jsonの中身も合わせて修正します。
- package.json
"scripts": { "start": "node server" },
この後、npmコマンドでアプリケーションが起動することを確認します。
npm start
http://localhost:3000にアクセスして、動作していることを確認します。
サーバの自動再起動を行えるように node-dev をインストールする
scriptを修正した時に、自動でサーバを再起動してくれるmoduleにnode-devがあります。
これが便利なので、使えるようにしましょう。
npm install node-dev --save
saveオプションをつけると、package.jsonに追記してくれるので、便利です。
また、このmoduleは開発時のみに利用するので、package.jsonのdependenciesではなく、devDependenciesに書くように修正します。さらに、npm run-scriptで起動できるようにscripts部にdevserver定義を追加します。
- package.json
{ "name": "blank-project", "version": "0.0.1", "private": true, "scripts": { "start": "node server", "devserver": "./node_modules/node-dev/node-dev server.js" }, "dependencies": { "express": "3.0.0rc5", "jade": "*" }, "devDependencies": { "node-dev": "~0.2.8" } }
これで以下のコマンドにより、自動再起動モードで起動するようになります。
npm run-script devserver
試しに、server.jsを変更して保存すると、サーバが自動的に再起動していることがログから分かります。
npm run-script devserver > blank-project@0.0.1 devserver /Users/ken/work/nodejs/blank > ./node_modules/node-dev/node-dev server.js Express server listening on port 3000 [INFO] Restarting Express server listening on port 3000 [INFO] Restarting Express server listening on port 3000
テスト用にmocha、requestをインストールする
テストにはmochaを使います。合わせてrequestもインストールします。
npm install mocha --save npm install request --save
これらも開発用なのでpackage.jsonを修正します。
- package.json
"devDependencies": { "node-dev": "~0.2.8", "mocha": "~1.6.0", "request": "~2.11.4" }
試しにテストを書いてみる
こんな感じです。
- test/_helper.js
process.env.NODE_ENV = 'test'; require('coffee-script');
- test/user-test.coffee
require "./_helper" assert = require "assert" request = require "request" app = require "../server" describe "user test", -> describe "GET /users ", -> body = null before (done) -> options = uri: "http://localhost:#{app.settings.port}/users" request options, (err, response, _body) -> body = _body done() it "has a test message", -> assert.ok /respond/.test(body)
これを起動できるようにテスト用の起動スクリプトを書きます。
- bin/test
#!/usr/bin/env sh ./node_modules/mocha/bin/mocha test/*.js test/*.coffee
さらにpackage.jsonのscripts部を修正します。
- package.json
{ "name": "blank-project", "version": "0.0.1", "private": true, "scripts": { "start": "node server", "test": "./bin/test", "devserver": "./node_modules/node-dev/node-dev server.js" }, "dependencies": { "express": "3.0.0rc5", "jade": "*", "coffee-script": "~1.3.3" }, "devDependencies": { "node-dev": "~0.2.8", "mocha": "~1.6.0", "request": "~2.11.4" } }
ちなみに、本体のserver.jsはtestモードで起動した際にポート番号を変えるように修正しています。
あとはテストコード側でappを利用できるように module.exports を追加しています。
- server.js
var express = require('express') , routes = require('./routes') , user = require('./routes/user') , http = require('http') , path = require('path'); var app = module.exports = express(); app.configure(function(){ app.set('port', process.env.PORT || 3000); app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); app.use(express.favicon()); app.use(express.logger('dev')); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(app.router); app.use(express.static(path.join(__dirname, 'public'))); }); app.configure('development', function(){ app.use(express.errorHandler()); }); app.configure('test', function(){ app.set('port', 3001); }); app.get('/', routes.index); app.get('/users', user.list); http.createServer(app).listen(app.get('port'), function(){ console.log("Express server listening on port %d in %s mode", app.settings.port, app.settings.env); });
最後にテストを実行してみましょう。
npm test > blank-project@0.0.1 test /Users/ken/work/nodejs/blank > ./bin/test Express server listening on port 3001 in test mode GET /users 200 2ms - 23 . レ 1 test complete (19 ms)
まとめ
node.js+expressでアプリケーションを作るのであれば、上記の手順で基本的な環境が整います。最後に、読まれた方に少しでも参考になれば、幸いです。