【问题标题】:Issue with express-session after upgrading socket.io to v3将 socket.io 升级到 v3 后出现 express-session 问题
【发布时间】:2021-01-08 16:11:18
【问题描述】:

我正在开发一个 Node/Express 后端,它使用 socket.io 库将事件发送到前端。我们决定将它(在后端和前端)升级到版本 3,但我们遇到了一个目前无法解决的问题。我会试着解释一下:

  • 每当客户端向后端进行身份验证时,它都会在它们之间打开一个套接字连接
  • 我们使用express-session 库将新的套接字ID 保存到会话中,代码如下:
this._socketIO.on('connection', socket => {
    // Add the socket id to the session
    socket.request.session.socketId = socket.id;
    socket.request.session.save();

    logger().info(`WebSocket: User connected (ID: ${socket.id})`);
    
    socket.on('disconnect', () => {
        logger().info(`WebSocket: User disconnected (ID: ${socket.id})`);
    });
});
  • 将套接字库更新到 v3.0.4 后,会话不再具有 socketId 字段。
  • 我已经意识到,如果我重新启动后端服务器,而 UI 中有一个已登录的客户端(因此,存在一个现有的会话文件),它可以正常工作。如果我从 UI 中注销并再次登录(因此它会创建一个新的会话文件),它将无法再次工作。

我一直在查看官方页面 (https://socket.io/docs/v3/migrating-from-2-x-to-3-0) 上的迁移文档,但找不到此问题的答案。

有什么线索吗?提前致谢,

【问题讨论】:

    标签: node.js socket.io express-session


    【解决方案1】:

    我们发现问题是因为我们注册了 2 个会话中间件,一个用于常规请求,另一个用于套接字请求(以保存关联的套接字 ID),有时由于竞争条件而失败.根据首先管理的请求,会话是否与套接字 id 一起保存。

    在完成所有需要的登录请求后,我们已经延迟了套接字连接,现在它工作正常。

    干杯,

    【讨论】:

      猜你喜欢
      • 2015-09-30
      • 2021-02-20
      • 2020-03-07
      • 1970-01-01
      • 2023-03-13
      • 2019-05-21
      • 2019-06-14
      • 2020-05-24
      • 1970-01-01
      相关资源
      最近更新 更多