我如何设置每个会话的默认variables

我已经build立了我的快速/连接应用程序来使用与redis的会话作为商店:

app.use(express.session({ secret: "secret key here", store: app.redisStore, cookie: { maxAge: 600000 } })); 

我通过执行以下操作创build了自己的Flash消息系统:

 module.exports = function (app) { 'use strict'; //set-up session messages app.use(function (req, res, next) { /* set up flash*/ if (req.session.flash === "undefined") { req.session.flash = []; } res.locals.messages = function () { var messages = req.session.flash; //clear out messages req.session.flash = []; return messages; }; ... 

然后基本上我只要将闪光灯消息对象插入闪存arrays,只要我需要它们。 每次使用消息function,他们都被清除。 这似乎大部分工作; 然而,在注销的时候,我使用了重新生成函数,并且flash变得未定义:

 function logout(req, res) { var currentUser = req.session.currentUser; req.session.regenerate(function (err) { req.session.flash.push({"type": "info", "message": "You have been logged out."}); console.log(currentUser + " Logged Out"); res.redirect("/login"); return; }); } 

这似乎是有道理的。 重新生成会删除会话,并且在初始请求闪存变为未定义之后发生。 为了避免这样的未来的问题,我想知道是否有某种会话的初始化函数,我可以重写或钩入? 我会用它来设置一些默认的会话值,每次会话开始或重新生成。

问题:闪存实际上是在redis中保存的吗?

为了避免这样的未来的问题,我想知道是否有某种会话的初始化函数,我可以重写或钩入? 我会用它来设置一些默认的会话值,每次会话开始或重新生成。

不,你这样做的方式是正确的。 如果你想附加多个动作来regenerate方法,那么你也可以尝试这样的事情:

 var EventEmitter = require('events').EventEmitter; var session_events = new EventEmitter( ); module.exports = function (app) { 'use strict'; //set-up session messages app.use(function (req, res, next) { var regenerate = req.session.regenerate; req.session.regenerate = function() { session_events.emit( "session_regenerated", req ); regenerate.apply( req.session, arguments ); }; /* set up flash*/ if (req.session.flash === "undefined") { session_events.emit( "session_initializing", req ); } // other code goes here }); } 

那么你可以简单地做:

 session_events.on( "session_regenerated", function(req) { req.session.flash.push({"type": "info", "message": "You have been logged out."}); }); session_events.on( "session_initializing", function(req) { req.session.flash = []; }); 

这是一个猴子补丁,但(至less。 .regenerate重写),所以我build议写你自己的会话存储 ,这是不难的,因为会话是没有别的,然后在Redis /任何其他存储条目。

问题:闪存实际上是在redis中保存的吗?

是的,所有附加到session都会进入会话存储(Redis就是这样)。