disconnect 或者 disconnecting 事件发生时,
this.ctx.socket = { remoteAddress: '127.0.0.1', remotePort: 7001 }
无法识别 具体是哪个连接断开了
https://github.com/eggjs/egg-socket.io/blob/master/lib/io.js#L75 具体看这里。断开时的socket和正常连接的socket是同一个对象。所以,检查一下你的转发服务是不是配错了,导致 remoteAddress 错误。
我也碰到这个问题了。。。一模一样的报错
由于是在本地开发,所以不存在啥转发服务
我知道了,因为 egg-core 里把 utils.callFn 写的是 async
,它最终会被解释成 promise ,然后又属于 Microtask , 等到它被执行的时候,在同步执行中的 onclose 早就把 socket 中有用信息给 remove 了
感觉这是个问题啊,建议可以再扩充一个同步版本的 utils.callFn,然后根据 handler 是不是 async 的来选择是否要用 async 的 utils.callFn 执行它。
有个快速能够修复的方法就是:写个连接中间,放在最前面,把 socket 信息复制存储到 ctx 上,这样当断开连接后,不会因为 socket 对象清空而拿不到信息。
至于插件层面怎么改进,我再研究一下。
感谢。
刚刚试了一下,发现了新问题,这次真不到原因了。。。
我直接改了 egg-socket.io 里的 lib/io.js 的源代码。。。

然后两次打出来的东西不一致,这就很致命了,我已经懵逼的不知所措了。。。

@anchengjian https://github.com/eggjs/egg-socket.io/pull/34
@anchengjian 试试 egg-socket.[email protected]
@ngot 解决了,666666