【问题标题】:socket.on("connection") with local eventEmitter listeners creating too many eventEmitter listenerssocket.on("connection") 与本地 eventEmitter 侦听器创建太多 eventEmitter 侦听器
【发布时间】:2021-07-05 11:30:15
【问题描述】:

我正在尝试将socket.iosocket.on("connection", client => {...} ) 事件中的本地事件侦听器一起使用。问题是每次创建新的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")    
    })

})

【问题讨论】:

    标签: node.js events socket.io


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 你是对的,我正在尝试将页面数据广播到任何连接的客户端。我想我没有想到我可以为此使用命名空间系统,但是对于像我现在正在做的批量操作来说,这是显而易见的,因为你已经指出了这一点。试试这个...
    猜你喜欢
    • 2011-12-21
    • 2014-06-06
    • 2013-10-13
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    相关资源
    最近更新 更多