Javascript 如何为每个会话设置默认变量
我已将我的express/connect应用程序设置为使用以redis为商店的会话:Javascript 如何为每个会话设置默认变量,javascript,node.js,express,redis,connect,Javascript,Node.js,Express,Redis,Connect,我已将我的express/connect应用程序设置为使用以redis为商店的会话: app.use(express.session({ secret: "secret key here", store: app.redisStore, cookie: { maxAge: 600000 } })); 我通过以下操作创建了自己的flash消息系统: module.exports = function (app) { 'use str
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;
};
...
然后,本质上我只要在需要时将flash消息对象推送到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;
});
}
这似乎有道理。REGENATE会删除会话,因为它发生在初始请求之后,所以闪存变得未定义。为了避免将来出现类似的问题,我想知道是否有一些初始化函数可以覆盖或挂接到会话中?每次启动或重新生成会话时,我都会使用它设置一些默认会话值
旁白:flash真的在redis中保存了吗
为了避免将来出现类似的问题,我想知道是否有
有一些初始化功能的会话,我可以
覆盖或钩住?我将使用它来设置一些默认会话值
每次启动或重新生成会话时
不,你这样做是正确的。如果要将多个操作附加到REGENATE
方法,还可以尝试以下操作:
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 = [];
});
不过,这是一个猴子补丁(至少是.regenate
重写),所以我建议您自己编写,这一点都不难,因为会话只是Redis/任何其他存储中的一个条目
旁白:flash真的在redis中保存了吗
是的,连接到会话的所有内容都将进入会话存储(您的例子中是Redis)