socket.on("connection") 与本地 eventEmitter 侦听器创建太多 eventEmitter 侦听器

socket.on("connection") with local eventEmitter listeners creating too many eventEmitter listeners

我正在尝试在 socket.on("connection", client => {...} ) 事件中使用 socket.io 和本地事件侦听器。问题是每次创建新的 socket.io 连接时,它都会创建一个新的事件侦听器。这最终导致 node.js.

中的最大听众错误

我在那里需要那个事件侦听器,这样它就可以等待来自应用程序其他部分的数据,然后使用返回的 socket.io client 对象将该数据发送到连接的 socket.io客户。

我应该根据 documentation 简单地增加 setMaxListeners 吗?还是我应该对我的代码做一些不同的事情,以防止每次客户端连接时都创建一个新的事件监听器(例如,有没有办法全局注册事件监听器,但将新的客户端连接传递给事件监听器并使用)?

io.on('connection', client => {
    //console.log("Websockets client connected")
    
    events.on("initializePage", data => {
        client.emit("initializePage", data)
    })
    client.on('disconnect', () => { 
        console.log("Socket.io client disconnected")    
    })

})

在您提供的代码片段中,全局 events eventEmitter 将为每个新套接字附加一个新的侦听器。所以确实,如果有很多客户端连接,一段时间后 maxListeners 会很快耗尽。

避免无限期地添加侦听器的第一步是在每次客户端断开连接时进行一些清理,方法是拆除它使用 off 方法注册的所有侦听器。

如果客户端只需要通知一次,您可以决定使用 once 方法而不是 on 注册监听器,这将在一次后自动清理触发器。

但是,更具体地回到 socket.io,我觉得你正处于想要执行某种 broadcast/multicast 的情况。因此,如何使用命名空间系统并调用:

events.on("initializePage", data => {
  io.sockets.emit("initializePage", data);
})

此代码必须写在文件的顶层,而不是 connection 处理程序中。