【问题标题】:NodeJS warning: possible event emitter leak. 11 open listeners addedNodeJS 警告:可能的事件发射器泄漏。添加了 11 个开放式侦听器
【发布时间】: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' 功能都出现此错误。

【问题讨论】:

标签: javascript node.js memory-leaks node-modules


【解决方案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。我觉得这可能与问题有关。
猜你喜欢
  • 2013-03-12
  • 2016-10-08
  • 2016-06-12
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
  • 2021-01-21
  • 2012-12-08
相关资源
最近更新 更多