Socket.io Client 3.0.3:Manager使用故障及重连Token添加问题
Socket.io 3.x 重连时携带Token及Manager使用问题解决方案
我正好对Socket.io 3.x的重连机制比较熟悉,帮你梳理下问题和解决办法:
1. 先解决Manager连接失败的问题
你在初始化Manager时犯了两个关键错误:
- URL参数配置混乱:Socket.io 3.x的Manager构造函数第一个参数需要传入完整的Socket.io服务器地址(协议+主机+端口),不需要再在options里单独设置
hostname/port,这些信息应该直接包含在URL中。 - 误用
window.location:直接传window.location会让Manager尝试连接当前页面的服务器,如果页面服务器和Socket.io服务器不是同一个,或者存在路由重定向,就会触发页面无限刷新。
正确的Manager初始化代码应该是这样的:
// 直接传入Socket.io服务器的完整URL const manager = new Manager('http://localhost:8080', { path: '/socket.io', // 若服务器默认挂载在/socket.io,这个参数可以省略 query: { token: 'abc' } // 首次连接的参数 }); // 必须通过manager.socket()获取socket实例,指定命名空间(默认根命名空间/) this.socket = manager.socket('/');
如果页面和Socket.io服务器是同域部署,也可以用相对路径简化:
const manager = new Manager('/', { path: '/socket.io' }); this.socket = manager.socket('/');
2. 核心问题:重连时自动携带Token
你提到的服务器重启后重连query为空,是因为静态的query配置只会在首次连接时生效,重连时不会自动复用。在Socket.io 3.x中,官方更推荐用auth选项来处理身份验证——它支持传入函数,重连时会重新执行该函数获取最新的Token,完美解决你的问题。
示例代码如下:
const manager = new Manager('http://localhost:8080', { path: '/socket.io', // auth支持函数,重连时会自动调用获取最新参数 auth: (callback) => { // 这里可以写获取有效Token的逻辑,比如从localStorage读取 const currentToken = localStorage.getItem('userToken') || 'abc'; // 回调传入验证参数,会自动附加到连接请求中 callback({ token: currentToken }); } }); this.socket = manager.socket('/');
这样配置后,不管是首次连接还是服务器重启后的重连,Manager都会自动调用auth函数获取Token,并附加到请求的query里,确保服务器能正常验证身份。
补充说明
你之前直接用io({ query: { token: 'abc' } })能正常工作,是因为io()内部会自动创建Manager实例,默认使用当前页面的URL作为Socket.io服务器地址(同域场景下),但这种方式无法自定义重连行为,所以才需要手动创建Manager来控制。
最后别忘了确保你的Socket.io服务器版本和客户端版本一致(都是3.0.3),跨版本可能存在兼容性问题。
内容的提问来源于stack exchange,提问作者Diogyn
相关产品推荐
相关产品推荐

