【发布时间】:2012-12-17 11:24:53
【问题描述】:
我已经阅读了一些关于如何为会话安装持久存储解决方案(用于 Node/Express 设置)对于小型网站(redis、mongo 等)来说似乎有点矫枉过正的各种 cmet。
除了持久性之外,我只能发现旧会话的垃圾收集是不在生产网站中使用 Memory Store 的原因......(即,我关闭了浏览器,但会话仍存储在内存存储中服务器)
我投入了类似这个简单的垃圾收集器来解决这个问题:
var sessionGarbageCollector = function(req, res, next) {
// Set a session lifetime (Renewed each time this is called)
var now = new Date();
var expirydate = now.getime();
expirydate += 60000; // Some Session lifespan
req.session.LifeTime = expirydate;
req.session.sessionID = req.sessionID; // Make session ID accessible inside session
// Loop through all sessions and check for expired sessions
for ( var x in req.sessionStore.sessions ) {
req.sessionStore.get(x, function(err,sessionObj) {
if ( sessionObj.LifeTime ) {
if ( now.getTime() > sessionObj.LifeTime ) {
console.log("Removing Expired Sesson: " + sessionObj.sessionID);
req.sessionStore.destroy(sessionObj.sessionID, function(err,data) { } );
}
}
});
}
next();
}
然后我添加了以下内容,以便在每个请求上运行它——所以每次有人请求一个页面时,垃圾收集器都会检查是否应该删除任何会话:
app.use(sessionGarbageCollector);
现在可能,我不想每次都调用它,但仅在 10 分钟后或某个间隔后的请求中调用......但这已经足够接近我想要的了。 (对于“让我保持登录”会话,我会在客户端上覆盖会话密钥 cookie 的“仅会话”状态,并设置一个特定的到期日期 - 在 与 req.session.LifeTime 的会话,所以你得到保留的会话......好吧,如果没有人重新启动服务器......)
我想知道这种方法还有哪些我没有看到的问题? (即除了垃圾回收,Memory Store 还有什么其他限制)
其他人对此有何体验?也许其他人已经尝试过这种事情?
【问题讨论】:
标签: node.js session express connect