NodeJS 警告:可能的事件发射器泄漏。添加了 11 个开放式侦听器

Posted

技术标签:

【中文标题】NodeJS 警告:可能的事件发射器泄漏。添加了 11 个开放式侦听器【英文标题】:NodeJS warning: possible event emitter leak. 11 open listeners added 【发布时间】:2017-10-19 01:35:15 【问题描述】:

我正在使用 NodeJS 和 WS 来测试 websocket。为了从服务器上卸载一些工作,我想将 ping 从客户端发送到服务器,而不是反过来。但是,每当我运行我的代码时,我都会收到此错误:

> (node) warning: possible EventEmitter memory leak detected. 11 pong listeners added. Use emitter.setMaxListeners() to increase limit.
Trace
    at WebSocket.addListener (events.js:239:17)
    at Object.<anonymous> (/home/ubuntu/NodeJS-Runtime/websockets/client.js:40:12)
    at Module._compile (module.js:410:26)
    at Object.Module._extensions..js (module.js:417:10)
    at Module.load (module.js:344:32)
    at Function.Module._load (module.js:301:12)
    at Function.Module.runMain (module.js:442:10)
    at startup (node.js:136:18)
    at node.js:966:3

这是我的代码:

for(var i=0; i<20; i++) 
    const clientNum = i;
    const ws = new WebSocket('ws://localhost:8080', 
    perMessageDeflate: false
        );

    ws.onerror = function(error) 
        if(!hasFailed && clientNum != 0)
            console.log('failed on: ' + clientNum + error);
        hasFailed = true;
    

    ws.on('open', function() 
        // Send keep alive messages. Close if no response.
        ws.keepAlive = false;
        var interval = setInterval(function() 
            if (ws.keepAlive) 
                ws.close();
             else 
                ws.ping(null, null, true);
                ws.keepAlive = true;
            
        , 25*1000); // milliseconds between pings

    );
    ws.on("pong", function()  
            ws.keepAlive = false; 
    );

pong 和 'on' 功能都出现此错误。

【问题讨论】:

我刚刚使用ws@3.0.0 和 node v 7.5.0 测试了此代码的重写,即使每个集群有 100 个客户端,我也没有收到任何警告。 Here's my attached code in a zip file for reference。抱歉,我无法重现您的问题。 【参考方案1】:

这不是错误,这是警告。如果您想禁用警告,请调用 ws.setMaxListeners(0) 以表明您知道您设置了 10 个以上的侦听器,以便运行时可以看到您知道您在做什么。

此外,设置ws.onerror 属性是不好的做法。相反,您需要致电 ws.on('error', function (error) ...,但这与您所询问的问题无关。

【讨论】:

我明白,对于错误的术语感到抱歉。我更担心的是我是否有导致该错误的错误。人们说只有在同一个物体上有 11 个发射器时才会发生这种情况。但我只想要每个对象 2 个发射器。 @dalanb 例如,ws 模块可能已经在内部分配了 10 个其他侦听器,以支持您用于 onerror 的属性分配侦听器回调。不过,我无法证实这一点,但我认为是这样。无论如何,如果您担心内存泄漏,您可以分配一个值12 并用它进行测试。 如果我使 for 循环小于 10 或将 ws 从 const 更改为 var,错误就会消失。 但是,如果它是一个 var,它不能与 ping/pong 一起正常工作,并且没有捕获事件 在这种情况下,您将需要提供更多代码。具体来说,您如何导入WebSocket。我觉得这可能与问题有关。

以上是关于NodeJS 警告:可能的事件发射器泄漏。添加了 11 个开放式侦听器的主要内容,如果未能解决你的问题,请参考以下文章

Node.js进击基础一(5-11事件模块)

Electron App 中的事件发射器内存泄漏

Nodejs事件发射器程序中语句的执行顺序

如何自己检查NodeJS的代码是不是存在内存泄漏

在 ARC 中收到内存警告

处理 AsyncTask 警告类应该是静态的,否则可能会发生泄漏