为了账号安全,请及时绑定邮箱和手机立即绑定

检测到可能的EventEmitter内存泄漏

检测到可能的EventEmitter内存泄漏

慕盖茨4494581 2019-08-26 17:38:58
检测到可能的EventEmitter内存泄漏我收到以下警告:(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit. Trace:      at EventEmitter.<anonymous> (events.js:139:15)     at EventEmitter.<anonymous> (node.js:385:29)     at Server.<anonymous> (server.js:20:17)     at Server.emit (events.js:70:17)     at HTTPParser.onIncoming (http.js:1514:12)     at HTTPParser.onHeadersComplete (http.js:102:31)     at Socket.ondata (http.js:1410:22)     at TCP.onread (net.js:354:27)我在server.js中编写了这样的代码:http.createServer(     function (req, res) { ... }).listen(3013);如何解决这个问题?
查看完整描述

3 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

我想在此指出,警告是有原因的,并且很有可能正确的修复不会增加限制,但要弄清楚为什么要为同一事件添加如此多的监听器。如果您知道为什么要添加如此多的听众并且确信这是您真正想要的,那么只能增加限制。

我发现这个页面是因为我收到了这个警告,在我的情况下,我使用的一些代码中存在一个错误,即将全局对象转换为EventEmitter!我当然建议不要在全球范围内增加限制,因为你不希望这些事情被忽视。


查看完整回答
反对 回复 2019-08-26
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

默认情况下,任何单个事件最多可以注册10个侦听器。


如果是您的代码,您可以通过以下方式指定maxListeners:


const emitter = new EventEmitter()

emitter.setMaxListeners(100)

// or 0 to turn off the limit

emitter.setMaxListeners(0)

但如果它不是您的代码,您可以使用该技巧来全局增加默认限制:


require('events').EventEmitter.prototype._maxListeners = 100;

当然你可以关掉限制但要小心:


// turn off limits by default (BE CAREFUL)

require('events').EventEmitter.prototype._maxListeners = 0;

BTW。代码应该在应用程序的最开头。


ADD:从节点0.11开始,此代码也可以更改默认限制:


require('events').EventEmitter.defaultMaxListeners = 0


查看完整回答
反对 回复 2019-08-26
  • 3 回答
  • 0 关注
  • 1799 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信