node.js + expressでsessionを使う

最近、また書き始めたnode.js。
前回より早く学習できている気がします。というか前回は自分が今まで作ってたwebプログラムの意識で学習していたので変な固定概念にとらわれていたのかと思います。。。
んで、今日はnode+expressでsessionを扱おうと思っていたんですが、普通にリクエストオブジェクトのsessionプロパティ触ったら500エラーになりました。。。
環境は以下の通り
- node v0.6.18
- express 2.5.10
コードは以下の通り
app.js
/**
* Module dependencies.
*/
var express = require('express'),
,routes = require('./routes');
var app = module.exports = express.createServer();
// Configuration
app.configure(function(){
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(__dirname + '/public'));
});
app.configure('development', function(){
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});
app.configure('production', function(){
app.use(express.errorHandler());
});
// Routes
app.get('/', routes.index);
routes/index.js
exports.signup = function(req,res){
req.session.polidog = "いけめん";
}
って書いてあげて、実行してみたら500エラーが…
TypeError: Cannot set property 'polidog' of undefined
多分セッション系のライブラリを用意しなければとおもい、app.jsを修正
// Configuration
app.configure(function(){
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(__dirname + '/public'));
app.use(express.session({secret:"hogehoge"}));
});
まだエラーはでます。。
500 TypeError: Cannot read property 'connect.sid' of undefined
うーむ。。とおもったら、cookieParserも必要らしい…
// Configuration
app.configure(function(){
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.static(__dirname + '/public'));
app.use(app.router);
app.use(express.cookieParser());
app.use(express.session({secret:"hogehoge"}));
});
それでもどうやらエラーが。。。。
もうどうしていいかわからない(´・ω・`)
適当にいじってたらどうやらapp.routerの記述の位置がだめみたい。下に変えてみたらなおったwww
結局cookieParser→session→app.routerの順番で記述すればいいみたい。
あ、そうそうサンプルでよく「 app.use(express.session());」って書いてあるサンプル多かったですが、僕のバージョンだと「 app.use(express.session({secret:”hogehoge”}));」と書かないとだめですね。
最終的なapp.js
// Configuration
app.configure(function(){
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.static(__dirname + '/public'));
app.use(express.cookieParser());
app.use(express.session({secret:"hogehoge"}));
app.use(app.router);
});