首页 > 解决方案 > 使用 Socket.IO 同步 Express Session

问题描述

我面临一个问题,我需要与我的Node.js 服务器以及我的Socket.IO 实例进行通信。这部分有效,但我还需要访问我使用Express创建的会话,即使在Socket.IO 侦听器中也是如此。为此,我正在使用express-socket.io-session。它在技术上有效,但不是我想要的方式。当我对会话进行更改时,我req.session.save(function(err) {})会确保它确实被保存。我也在socket.handshake.session.save(function(err) {})Socket.IO监听器中使用。会话已保存,但我注意到虽然可以在侦听器之外按预期访问会话,但在我的任何Socket.IO 侦听器中使用它们这不是……容易吗?它们是不同步的。例如,如果我运行req.session.user = "abc",它将undefinedSocket.IO 侦听器中显示...除非我刷新页面。多亏了这个发现和这里的一些答案,我意识到从客户端断开和连接Socket.IO可以解决这个问题。但我不确定这是否是解决问题的最佳方法。尽管它有效,但在某些情况下,我不能只是一次又一次地断开连接和连接。在另一个......寻找解决方案的会议之后,我socket.handshake.session.reload(function(err) {})在做任何其他事情之前尝试使用。奇怪的是,我认为它有时确实有效。但即使这是真的,会话undefined大部分时间都保持该值。我使用以下配置:

var session = require("express-session")({
    // ...
    resave: false,
    saveUninitialized: false
});

我尝试saveUninitialized: true改用它,它似乎确实同步了会话,但它没有响应用户通过浏览器手动删除其 cookie 的场景。在这种情况下,会话实际上应该显示为undefined. 它确实......只是不在听众内部。文档还说 usingtrue已被弃用。

我被这个问题困住了,尽管尽我所能找到解决方案,但我做不到。我可以尝试其他方法吗?

标签: javascriptnode.jsexpresssocket.ioexpress-session

解决方案


推荐阅读