Node.js 检测到可能的EventEmitter内存泄漏

Node.js 检测到可能的EventEmitter内存泄漏,node.js,memory-leaks,eventemitter,Node.js,Memory Leaks,Eventemitter,我得到以下警告: (节点)警告:检测到可能的EventEmitter内存泄漏。增加了11名听众。使用emitter.setMaxListeners()增加限制。 跟踪: 在黄昏时分。(events.js:139:15) 在黄昏时分。(node.js:385:29) 在服务器上。(server.js:20:17) 在Server.emit上(events.js:70:17) 在HTTPParser.onIncoming(http.js:1514:12) 在HTTPParser.onHeadersC

我得到以下警告:

(节点)警告:检测到可能的EventEmitter内存泄漏。增加了11名听众。使用emitter.setMaxListeners()增加限制。
跟踪:
在黄昏时分。(events.js:139:15)
在黄昏时分。(node.js:385:29)
在服务器上。(server.js:20:17)
在Server.emit上(events.js:70:17)
在HTTPParser.onIncoming(http.js:1514:12)
在HTTPParser.onHeadersComplete(http.js:102:31)
在Socket.ondata(http.js:1410:22)
在TCP.onread(net.js:354:27)
我在server.js中编写了如下代码:

http.createServer(
    function (req, res) { ... }).listen(3013);
如何解决这个问题

这在中进行了解释

这是什么版本的Node?你还有什么代码?这不是正常的行为

简而言之,它:
process.setMaxListeners(0)

另请参见:

.on()
替换为
一次()
。当事件由同一函数处理时,使用
once()
删除事件侦听器

如果这不能解决问题,那么在package.json中重新安装restler “restler”:git://github.com/danwrong/restler.git#9d455ff14c57ddbe263dbbcd0289d76413bfe07d"

这与restler 0.10对节点的不当行为有关。您可以在此处看到git上关闭的问题:
但是,npm还没有更新这个,因此您必须引用git头。

默认情况下,任何单个事件最多可以注册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;
顺便说一句,代码应该在应用程序的最开始

添加:由于节点0.11,此代码还用于更改默认限制:

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

我想在这里指出,这个警告是有原因的,很有可能正确的解决方案不是增加限制,而是找出为什么要在同一事件中添加这么多侦听器。只有当你知道为什么要增加这么多听众,并且确信这是你真正想要的,才可以增加限制


我找到这个页面是因为我得到了这个警告,在我的例子中,我使用的一些代码中有一个bug,它将全局对象变成了EventEmitter!我当然建议不要在全球范围内增加限制,因为你不希望这些事情被忽视。

将其放在server.js(或包含main Node.js应用程序的任何内容)的第一行:

require('events').EventEmitter.prototype.\u maxListeners=0


错误消失了:)

您说您正在使用
process.on('uncaughtException',callback)

你在哪里执行这个语句?它是否在传递给
http.createServer
的回调中?
如果是,则在每次新请求时,同一回调的不同副本将附加到uncaughtException事件,因为
函数(req,res){…}
会在每次新请求传入时执行,语句
也会处理.on('uncaughtException',回调)

请注意,流程对象对所有请求都是全局的,每次新请求传入时都向其事件添加侦听器是没有意义的。您可能不希望出现这种行为。
如果您希望为每个新请求附加一个新侦听器,则应删除之前附加到事件的所有侦听器,因为它们不存在o需要更长时间使用:
进程。removeAllListeners('uncaughtException');
在mac osx上安装aglio时,我也收到此警告

我用cmd修复它

sudo npm install -g npm@next

在我的例子中,是
child.stderr.pipe(process.stderr)
在我启动10(大约)时被调用因此,任何导致将事件处理程序附加到循环中的同一EventEmitter对象的操作都会导致nodejs抛出此错误。

有时,这些警告出现在我们没有做的事情,而是忘记做的事情的时候

我在使用npm安装dotenv包时遇到此警告,但在我开始在应用程序的开头添加require('dotenv').load()语句之前被中断。当我返回项目时,我开始收到“检测到可能的EventEmitter内存泄漏”警告

我以为问题出在我做过的事情上,而不是我没有做过的事情


一旦我发现了我的疏忽并添加了require语句,内存泄漏警告就被清除了。

我们团队对此的修复方法是从.npmrc中删除一个注册表路径。我们在rc文件中有两个路径别名,其中一个指向已弃用的Artifactory实例


这个错误与我们的应用程序的实际代码无关,而是与我们的开发环境有关。

直到今天,我才开始使用
grunt watch
。最终由

观察:{
选项:{
maxListeners:99,
利弗雷罗德:没错
},
}

恼人的信息消失了。

公认的答案提供了关于如何增加限制的语义,但正如@voltrevo指出的,警告是有原因的,您的代码可能有缺陷

考虑以下错误代码:

//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');
}
//假设记录器是一个发出错误的模块
var Logger=require('./Logger.js');
对于(变量i=0;i<11;i++){
//错误:这将导致警告
//当事件侦听器添加到循环中时
Logger.on('error',函数(err){
console.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');
}
//好:事件侦听器不在循环中
Logger.on('error',函数(err){
console.log('写入日志时出错:'+err)
});
对于(变量i=0;i<11;i++){
Logger.writeLog('Hello');
}
在更改maxListeners之前,在代码中搜索类似的问题(其中
socketEventsHandler(req, res, next) {
        req.socket.on("error", function(err) {
            console.error('------REQ ERROR')
            console.error(err.stack)
        });
        res.socket.on("error", function(err) {
            console.error('------RES ERROR')
            console.error(err.stack)
        });
        next();
    }
socket.removeAllListeners(); 
this.socket.removeAllListeners("connect");
process.on('warning', e => console.warn(e.stack));
(node:17905) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 wakeup listeners added. Use emitter.setMaxListeners() to increase limit
MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 wakeup listeners added. Use emitter.setMaxListeners() to increase limit
    at _addListener (events.js:255:17)
    at Connection.addListener (events.js:271:10)
    at Connection.Readable.on (_stream_readable.js:826:35)
    at Connection.once (events.js:300:8)
    at Connection._send (/var/www/html/fleet-node-api/node_modules/http2/lib/protocol/connection.js:355:10)
    at processImmediate (timers.js:637:19)
    at process.topLevelDomainCallback (domain.js:126:23)

pool.getConnection((err, conn) => {

  if(err) reject(err)

  const q = 'SELECT * from `a_table`'

  conn.query(q, [], (err, rows) => {

    conn.release()

    if(err) reject(err)

    // do something
  })

  conn.on('error', (err) => {

     reject(err)
  })
})