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 个开放式侦听器的主要内容,如果未能解决你的问题,请参考以下文章