我得到以下警告:
(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);
如何解决这个问题?
公认的答案提供了如何增加限制的语义,但正如@voltrevo指出的那样,警告是有原因的,您的代码可能存在错误。
考虑以下有bug的代码:
//Assume Logger is a module that emits errors
var Logger = require('./Logger.js');
for (var i = 0; i < 11; i++) {
//BUG: This will cause the warning
//As the event listener is added in a loop
Logger.on('error', function (err) {
console.log('error writing log: ' + err)
});
Logger.writeLog('Hello');
}
现在观察添加监听器的正确方法:
//Good: event listener is not in a loop
Logger.on('error', function (err) {
console.log('error writing log: ' + err)
});
for (var i = 0; i < 11; i++) {
Logger.writeLog('Hello');
}
在更改maxListeners之前搜索代码中的类似问题(在其他答案中有解释)
缺省情况下,任何单个事件最多可以注册10个侦听器。
如果这是你的代码,你可以通过:
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;
顺便说一句。代码应该在应用程序的最开始。
ADD:从节点0.11开始,这段代码也可以改变默认限制:
require('events').EventEmitter.defaultMaxListeners = 0