possível memory leaks EventEmitter detectado

Estou recebendo o seguinte aviso:

(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit. Trace: at EventEmitter. (events.js:139:15) at EventEmitter. (node.js:385:29) at Server. (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) 

Eu escrevi código como este no server.js:

 http.createServer( function (req, res) { ... }).listen(3013); 

Como consertar isto ?

Isso é explicado no manual: http://nodejs.org/docs/latest/api/events.html#events_emitter_setmaxlisteners_n

Qual versão do Node é essa? Que outro código você tem? Isso não é um comportamento normal.

Em suma, é: process.setMaxListeners(0);

Veja também: node.js – request – Como “emitter.setMaxListeners ()”?

Gostaria de salientar aqui que esse aviso existe por um motivo e há uma boa chance de que a correção correta não esteja aumentando o limite, mas sim descobrir por que você está adicionando tantos ouvintes ao mesmo evento. Apenas aumente o limite se você souber por que tantos ouvintes estão sendo adicionados e estiver confiante de que é o que você realmente quer.

Eu encontrei esta página porque eu recebi este aviso e no meu caso houve um bug em algum código que eu estava usando que estava transformando o object global em um EventEmitter! Eu certamente aconselho a não aumentar o limite globalmente porque você não quer que essas coisas passem despercebidas.

Por padrão, um máximo de 10 ouvintes pode ser registrado para qualquer evento único.

Se for o seu código, você pode especificar maxListeners via:

 const emitter = new EventEmitter() emitter.setMaxListeners(100) // or 0 to turn off the limit emitter.setMaxListeners(0) 

Mas se não for o seu código, você pode usar o truque para aumentar o limite padrão globalmente:

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

Claro que você pode desligar os limites, mas tenha cuidado:

 // turn off limits by default (BE CAREFUL) require('events').EventEmitter.prototype._maxListeners = 0; 

BTW. O código deve estar no início do aplicativo.

ADD: Desde o nó 0.11, este código também funciona para alterar o limite padrão:

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

A resposta aceita fornece a semântica sobre como aumentar o limite, mas como @voltrevo apontou que o aviso está lá por uma razão e seu código provavelmente tem um bug.

Considere o seguinte código de buggy:

 //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'); } 

Agora observe a maneira correta de adicionar o ouvinte:

 //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'); } 

Procure por problemas semelhantes no seu código antes de alterar os maxListeners (o que é explicado em outras respostas)

substitua .on () por uma vez (). usar once () remove os ouvintes de events quando o evento é manipulado pela mesma function. fonte: http://nodeguide.com/beginner.html#using-eventemitters

se isso não resolver, reinstale o restler com isso em seu pacote.json “restler”: “git: //github.com/danwrong/restler.git#9d455ff14c57ddbe263dbbcd0289d76413bfe07d”

isso tem a ver com o restler 0.10 se comportando mal com o nó. você pode ver o problema fechado no git aqui: https://github.com/danwrong/restler/issues/112 no entanto, o npm ainda não atualizou isso, então é por isso que você deve se referir ao git head.

feliz restling 🙂

Eu estou recebendo este aviso também quando instalar o aglio no meu mac osx.

Eu uso cmd consertá-lo.

 sudo npm install -g npm@next 

https://github.com/npm/npm/issues/13806

No meu caso, foi child.stderr.pipe(process.stderr) que estava sendo chamado quando eu estava iniciando 10 (ou mais) instâncias da criança. Portanto, qualquer coisa que leve a append um manipulador de events ao mesmo object EventEmitter em um LOOP, faz com que o nodejs lance esse erro.

Às vezes, esses avisos ocorrem quando não é algo que fizemos, mas algo que esquecemos de fazer!

Eu encontrei este aviso quando instalei o pacote dotenv com npm, mas fui interrompido antes de adicionar a instrução require (‘dotenv’). Load () no início do meu aplicativo. Quando voltei ao projeto, comecei a receber os avisos “Possible EventEmitter memory leak detect” (Perda de memory EventEmitter detectada).

Presumi que o problema era algo que eu havia feito, não algo que não havia feito!

Depois que descobri minha supervisão e adicionei a declaração require, o aviso de memory leaks foi apagado.

Eu estava tendo isso até hoje quando começo a grunt watch . Finalmente resolvido por

 watch:{ options:{ maxListeners: 99, livereload: true }, } 

A mensagem irritante se foi.

Você disse que está usando process.on('uncaughtException', callback);
Onde você está executando esta declaração? Está dentro do retorno de chamada passado para http.createServer ?
Se sim, uma cópia diferente do mesmo retorno de chamada será anexada ao evento uncaughtException a cada nova requisição, porque a function (req, res) { ... } é executada toda vez que uma nova requisição chega e o process.on('uncaughtException', callback); instrução também será executado. process.on('uncaughtException', callback);
Observe que o object de processo é global para todas as suas solicitações e a inclusão de ouvintes em seu evento toda vez que uma nova solicitação chegar não fará sentido. Você pode não querer esse tipo de comportamento.
Caso você queira append um novo ouvinte a cada nova solicitação, remova todos os ouvintes anteriores anexados ao evento, já que eles não seriam mais necessários usando:
process.removeAllListeners('uncaughtException');

A solução da nossa equipe para isso foi remover um caminho de registro do nosso .npmrc. Tínhamos dois aliases de caminho no arquivo rc e um estava apontando para uma instância do Artifactory que estava obsoleta.

O erro não tem nada a ver com o código real do nosso aplicativo, mas tudo a ver com o nosso ambiente de desenvolvimento.

Eu estava tendo o mesmo problema. e o problema foi causado porque eu estava ouvindo a porta 8080, em 2 ouvintes.

setMaxListeners() funciona bem, mas eu não recomendaria isso.

A maneira correta é, verificar o seu código para ouvintes extra, remover o ouvinte ou alterar o número da porta em que você está ouvindo, isso resolveu o meu problema.

Eu atualizei da versão antiga do LTS, 6 algo, para a nova versão 8.9.4 do LTS e meus erros foram embora.

Eu prefiro procurar e corrigir problemas em vez de suprimir logs sempre que possível. Depois de alguns dias observando esse problema no meu aplicativo, percebi que estava definindo ouvintes no req.socket em um middleware do Express para capturar erros do soquete io que continuavam aparecendo. Em algum momento, aprendi que isso não era necessário, mas mantive os ouvintes ao redor de qualquer maneira. Acabei de removê-los e o erro que você está sentindo desapareceu. Verifiquei que era a causa executando solicitações para o meu servidor com e sem o seguinte middleware:

 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(); } 

Remover esse middleware parou o aviso que você está vendo. Eu procuraria em torno de seu código e tentaria encontrar em qualquer lugar você pode estar configurando ouvintes que você não precisa.

Coloque isso na primeira linha do seu server.js (ou qualquer que seja o seu aplicativo principal do Node.js):

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

e o erro vai embora 🙂