我已经设置了我的express/connect应用程序,以使用redis作为商店的会话:
app.use(express.session({
secret: "secret key here",
store: app.redisStore,
cookie: { maxAge: 600000 }
}));
我创建了自己的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;
};
...
然后,基本上我只是在需要时将闪存消息对象推入闪存阵列。每次使用消息功能时,它们都会被清除。这似乎在很大程度上起作用;然而,在注销时,我使用了reproduce函数,flash变为undefined:
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变为未定义。为了避免将来出现类似的问题,我想知道是否有某种类型的会话初始化函数,我可以覆盖或挂钩到?每次启动或重新生成会话时,我都会使用它来设置一些默认会话值。
附带问题:flash真的被redis保存了吗?
1条答案
按热度按时间06odsfpq1#
为了避免将来出现类似的问题,我想知道是否有某种类型的会话初始化函数,我可以覆盖或挂钩到?每次启动或重新生成会话时,我都会使用它来设置一些默认会话值。
不,你这样做是正确的。如果你想给
regenerate
方法附加多个动作,那么你也可以尝试这样做:然后你可以简单地做:
这是一个猴子补丁,虽然(至少
.regenerate
覆盖),所以我建议编写自己的session store,这一点也不难,因为会话只是Redis/任何其他存储中的一个条目。附带问题:flash真的被redis保存了吗?
是的,附加到
session
的所有内容都将进入会话存储(在您的情况下是Redis)。