2012-11-26 114 views
2

我已经建立了我的快递/连接应用程序来使用会话使用Redis的作为商店:我如何设置默认的变量为每个会话

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

我已经通过执行以下操作创建了自己的闪光消息系统:

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; 
     }; 
     ... 

然后基本上我只是把闪光的消息对象到闪存阵列,每当我需要他们。每次使用消息功能时,它们都会被清除。这似乎大部分工作;然而,尽管退出我用的是再生功能和闪光灯是不确定的:

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; 
      }); 
     } 

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

侧面问题:是Flash实际上得到保存在Redis的?

回答

2

为了避免这样的任何未来的问题,我想知道是否有 有某种形式的初始化函数的对,我可以 覆盖或挂接到会议?我会用它来设定每一个会话启动或再生时的一些默认会话值 。

不,你这样做的方式是正确的。如果你要多个动作重视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 = []; 
}); 

这是一只猴子补丁,但(至少在.regenerate压倒一切),所以我建议编写自己的session store,这都不难,因为会议是没有别的然后Redis的/任何其他存储的条目。

侧面问题:是Flash实际上得到保存在Redis的?

是的,所有连接到session的东西都会进入会话存储(Redis)。