Express アプリでメッセージ アラート ミドルウェア connect-flash を使用しています。このミドルウェアは github https://github.com/jaredhanson/connect-flashにあります。
connect-flash のソース コードを見ると、this.session オブジェクトがどこから来たのか本当にわかりません。connect-flash のソース コードを考えてみましょう。
module.exports = function flash(options) {
options = options || {};
var safe = (options.unsafe === undefined) ? true : !options.unsafe;
return function(req, res, next) {
if (req.flash && safe) { return next(); }
req.flash = _flash;
next();
}
}
function _flash(type, msg) {
if (this.session === undefined) throw Error('req.flash() requires sessions');
var msgs = this.session.flash = this.session.flash || {};
if (type && msg) {
// util.format is available in Node.js 0.6+
if (arguments.length > 2 && format) {
var args = Array.prototype.slice.call(arguments, 1);
msg = format.apply(undefined, args);
} else if (isArray(msg)) {
msg.forEach(function(val){
(msgs[type] = msgs[type] || []).push(val);
});
return msgs[type].length;
}
return (msgs[type] = msgs[type] || []).push(msg);
} else if (type) {
var arr = msgs[type];
delete msgs[type];
return arr || [];
} else {
this.session.flash = {};
return msgs;
}
}
Express で実装するには、app.configure ブロック内に含める必要があります。コードを検討する
app.configure(function () {
//Other middleware
app.use(function (req, res, next) {
console.log(this.session);
next();
});
app.use(flash());
カスタム ミドルウェアを見てください。this.session オブジェクトを表示すると、「未定義」になります。connect-flash で this.session が機能するのはなぜですか。セッション オブジェクトは取得できますが、ミドルウェアでは取得できません。ミドルウェアを作成するためのコールバック パターンはまったく同じです
(function (req, res, next) {
//Code
next();
}