Go语言go-socket.io服务端Emit事件React客户端无法接收问题排查
故障1:测试逻辑错误,消息仅返回给触发事件的连接
你当前代码里的s.Emit("reply", msg)是仅给触发status事件的当前连接回复消息,也就是你用iocat发起请求的那个终端连接,和React端的连接是完全独立的两个会话,React端自然收不到这个回复。
如果要测试React端接收效果,有两个方案:
- 用React端主动触发
status事件发送消息,对应连接就能收到自己的回复 - 如果需要广播给所有连接的客户端,替换
s.Emit为服务端实例的广播方法:
// 给根命名空间下的所有连接广播reply事件 server.BroadcastToNamespace("/", "reply", msg)
故障2:Socket.io服务端与客户端版本不匹配
go-socket.io库和前端socket.io-client的版本有严格的对应关系,版本不匹配会出现连接正常但事件无法传递的问题:
- 如果你用的
go-socket.io是v1.x版本,前端socket.io-client必须使用2.x版本 - 如果你用的
go-socket.io是v2.x版本,前端socket.io-client必须使用3.x/4.x版本
可以查看go.mod里的依赖版本,对应修改前端package.json中的socket.io-client版本后重新安装依赖测试。
故障3:缺少错误日志无法排查底层问题
你可以新增两处日志定位问题:
- Go端打印Emit调用的错误返回:
server.OnEvent("/", "status", func(s socketio.Conn, msg string) { log.Println("Message ", msg) err := s.Emit("reply", msg) // 新增错误打印 if err != nil { log.Println("emit reply失败:", err) } })
- 前端新增全局事件监听,确认是否有事件被遗漏:
event_server.onAny((event, ...args) => { console.log(`收到任意事件: ${event}`, args) })
其他低概率排查点
- 确认你iocat连接的
127.0.0.1:8000和React端连接的192.168.1.12:8000是同一个服务,避免服务端仅绑定了本地回环地址导致两个入口对应不同实例 - 确认前端
reply事件的注册逻辑没有被重复执行、或者组件卸载时被意外销毁
内容的提问来源于stack exchange,提问作者GurAAAAAShark
相关产品推荐
相关产品推荐

