node.js - 将 socket.io 升级到 v3 后出现 express-session 问题
问题描述
我正在使用该socket.io
库将事件发送到前端的 Node/Express 后端。我们决定将它(在后端和前端)升级到版本 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)检查迁移文档,但我找不到这个问题的答案.
有什么线索吗?提前致谢,
解决方案
我们发现问题是因为我们注册了 2 个会话中间件,一个用于常规请求,另一个用于套接字请求(以保存关联的套接字 ID),有时由于竞争条件而失败。根据首先管理哪些请求,会话是否使用套接字 id 保存。
在完成所有需要的登录请求后,我们已经延迟了套接字连接,现在它工作正常。
干杯,
推荐阅读
- javascript - Javascript 中的上一个按钮不起作用
- marklogic - 是否可以在 DHF 流文件中使用令牌替换?
- python-3.x - Tkinter 拖放期间的堆栈溢出
- spring-boot - 从 Spring Boot 应用程序属性调用 Elastic APM 属性
- python - 如何摆脱警告`RuntimeWarning:一个循环正在与具有待处理处理程序的子观察者分离
- android - 在 Java 类中解析 DataSnapshot 无法正常工作
- swift - 通过 typealias swift 关闭不起作用
- json - 如何在 Swift 中对来自多个 API/源的数据使用单个模型结构?
- python - 使用 `wb.save` 会导致“UnboundLocalError: local variable 'rel' referenced before assignment”
- angular - Angular中Highcharts工具提示的单元测试