tkuchikiの日記

新ブログ https://blog.tkuchiki.net

railwayjsでreq.sessionがundefinedになる場合の対処法

railwayjs init APP_NAME
で生成されたコードに対して、SessionStoreにRedisを指定するコードを足した場合のコードが以下のようになる。

config/environment.js

var express = require('express');
var RedisStore = require('connect-redis')(express);
var config = require('config');

app.configure(function(){
var cwd = process.cwd();
app.use(express.static(cwd + '/public', {maxAge: 86400000}));
app.set('view engine', 'ejs');
app.set('view options', {complexNames: true});
app.set('jsDirectory', '/javascripts/');
app.set('cssDirectory', '/stylesheets/');
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session({
secret: config.session.secret
, store: new RedisStore(config.redis)
, cookie: {
maxAge: config.session.maxAge
}
}));

app.use(express.methodOverride());
app.use(app.router);
});

この場合、req.sessionがundefinedとなる。
app.use(express.methodOverride()); の位置が正しくないらしく、
express.methodOverrideをexpress.sessionよりも前に記述するとreq.sessionに値がセットされる。

[修正後のコード]
config/environment.js
var express = require('express');
var RedisStore = require('connect-redis')(express);
var config = require('config');

app.configure(function(){
var cwd = process.cwd();
app.use(express.static(cwd + '/public', {maxAge: 86400000}));
app.set('view engine', 'ejs');
app.set('view options', {complexNames: true});
app.set('jsDirectory', '/javascripts/');
app.set('cssDirectory', '/stylesheets/');
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser());
app.use(express.session({
secret: config.session.secret
, store: new RedisStore(config.redis)
, cookie: {
maxAge: config.session.maxAge
}
}));

app.use(app.router);
});