Node.js在会话过期时运行函数Express & Passport

5
我使用以下代码(配合 Express.js 和 Passport.js)设置了最大会话时间:
  app.use(express.session({
    cookie: {
      maxAge : 3600000
    }
  }));

我希望在会话过期时运行一个函数(用于我的日志文件和分析)。大致如下所示:
app.use(express.session.onExpiry(function(user){
        console.log('User session for ' + user + ' has expired.')
    });
);

1
虽然没有直接解决这个具体问题,但是我对这个问题的回答可能会对你有所帮助。从中你会发现一个事实,那就是在express中并没有真正的会话(session)来跟踪或过期。如果你使用Redis作为你的会话存储,那么这个问答应该会对你有所帮助。 - barry-johnson
@barry-johnson 感谢您的评论。这是非常有见地的信息。我已经担心我必须保留自己的用户会话记录了。如果我这样做,我可能只会使用一个简单的js对象(而不是redis),因为我目前并不太关心无状态。 - Paul
1
不客气。是的,如果您制作自己的MemoryStore或扩展它,您可以相对容易地将其添加到扫描和过期/删除过程中。如果您没有处理可扩展性需求,那么这将起作用,但是在节点重新启动时,您将失去会话持久性(这可能比您预期的更频繁发生)。您仍然可以使用redis,但是在服务器上只需维护一种类似的数据结构(将其放入一个中间件中),其中仅包含会话键和最后触摸时间戳,并在此基础上进行日志记录和分析操作。 - barry-johnson
你使用的 Express 版本是哪个? - Farid Nouri Neshat
Express的版本应为3.x,而Passport则应使用最新版。如果这有帮助的话,我很乐意升级Express。 - Paul
这让我想转到Rails :( - Paul
1个回答

1
你正在设置一个cookie "expires"参数。一旦过期,浏览器会清除该cookie,你将不会知道它的存在 - 它根本不会随着未来请求之一到达。
你可以使用的技巧是将时间戳写入cookie,并将其生命周期(“expires”值)设置为某个遥远的时间(比如2037年)。这样,你就可以手动检查是否仍然希望将给定的cookie视为有效,或者是否要更新它。
不幸的是,你必须编写自己的代码,按照以下方式进行。
app.use(function(req, res, next) {
    //Checking previously set cookie (if there is one)
    var session = JSON.parse(req.cookies['session'] || '');
    if (session && new Date(session.expires) < new Date()) {
        console.log('User session has expired.')
    }

    //Resetting the cookie
    res.cookie('session', JSON.stringify({ session: <sessionIDKeyHere>, expires: Date.now() + 3600000 }), {
        expires: new Date(2037, 0, 1),
        httpOnly: true,
        secure: true //Do you have https? If no, set to false
    });

    next();
});

忘记补充:这不会立即跟踪会话过期,只有在下一次请求时才会。因此,如果我访问您的页面后从未返回,您将无法通过此方式找出。但是,您仍然可以记录我的信息并跟踪我是否曾经返回过。 - Arseny Smoogly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接