本文详解如何修复 socket.io 在定时任务中无法正常发射事件的问题,核心在于将 socket 连接监听移出业务逻辑,并维护客户端列表实现可靠广播,避免重复绑定和连接泄漏。
在使用 Socket.IO 构建实时更新功能时,一个常见误区是:在业务函数内部反复调用 io.on(“connection”, …)。正如您原始代码所示,每次执行 getRandomGists() 都会注册一次新的连接监听器——这不仅不会向已连接的客户端发送消息,反而导致内存泄漏、事件重复绑定,且因 socket.emit() 被包裹在 connection 回调内,实际只对此后新连入的客户端生效(解释了为何仅刷新页面后才“看似工作”)。
✅ 正确做法是:服务端仅在启动时注册一次 connection 事件监听器,统一收集活跃 socket 实例;业务逻辑(如 SVG 生成完成)则通过遍历该实例列表主动广播消息。
以下是优化后的完整服务端结构(关键修改已高亮):