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
アプリケーション内で発生したエラー処理。
リクエストの処理