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でアプリケーションを作るのであれば、上記の手順で基本的な環境が整います。最後に、読まれた方に少しでも参考になれば、幸いです。