NodeのWebアプリケーションフレームワーク Express

サーバサイドJavaScript Node.js入門 を年末に一読したのでまとめ。

Express

ルーティングやセッション管理、静的ファイル配信など限られた機能のみを提供する軽量フレームワーク

インストール

# node -v
v0.8.16
# npm install express -g
# express -V
3.0.5

スケルトンの作成

オプションとしてsessionのサポート、テンプレートエンジンにEJSを指定

# express express_sample -s -e

依存するモジュールは、package.jsonに記述されるのでnpm installコマンドで解決できる。依存モジュールは、express_sample/node_modulesにインストールされる。

# cd express_sample
# npm install

アプリケーションの起動

# node app.js
Express server listening on port 3000

スケルトのディレクトリ構造

.
├── app.js
├── node_modules/
├── package.json
├── public
│   ├── images
│   ├── javascripts
│   └── stylesheets
│       └── style.css
├── routes
│   ├── index.js
│   └── user.js
└── views
    └── index.ejs

app.js

/**
 * Module dependencies.
 */

var express = require('express')
  , routes = require('./routes')
  , user = require('./routes/user')
  , http = require('http')
  , path = require('path');

var app = express();

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'ejs');
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser('your secret here'));
  app.use(express.session());
  app.use(app.router);
  app.use(express.static(path.join(__dirname, 'public')));
});

app.configure('development', function(){
  app.use(express.errorHandler());
});

app.get('/', routes.index);
app.get('/users', user.list);

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

起動環境の指定方法は、NODE_ENVを指定する

# NODE_ENV=production node app.js

ルーティングハンドラ

app.jsのapp.get()の第1引数がルーティングパス。第2引数はコールバック関数。

app.get('/', routes.index);

routes/index.jsのコールバック関数は、resとresを引数に受け取ってres.render()でレンダリングして結果をレスポンスとして返す。

exports.index = function(req, res){
  res.render('index', { title: 'Express' });
};

レンダリングされるviews/index.ejs

<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <p>Welcome to <%= title %></p>
  </body>
</html>

Expressのミドルウェア

bodyParser

リクエストボディの内容をJavaScriptのオブジェクトにパースしてnext()を実行。

methodOverride

リクエストボディ内に_methodというパラメータがあった場合、その値でHTTPメソッドを上書きし、next()を実行。

cookieParser

リクエスト内のCookieをオブジェクトにパースし、next()を実行。

session

専用のCookieを用いてセッション管理し、next()を実行。

router

リクエストパスに対応するルーティングハンドラがある場合、それを呼び出すことでレスポンスを返し、なければnext()を実行。

router

リクエストパスに対応する静的ファイルが存在した場合はそのファイルをレスポンスとして送信。なければnext()を実行。

errorHandler

アプリケーション内で発生したエラー処理。

リクエストの処理

f:id:takaheraw:20130105123317p:plain