possível fuga de memória do evento detectado

estou a receber o seguinte aviso:

(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)
Escrevi um código como este no servidor.js:

http.createServer(
    function (req, res) { ... }).listen(3013);
Como resolver isto ?

Author: Whymarrh, 2012-03-19

15 answers

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

Que versão do nó é esta? Que outro código tens? Isso não é um comportamento normal.

Em resumo, a sua: process.setMaxListeners(0);

Ver também: nó.js-request-How to " emitter.setMaxListeners()"?

 72
Author: Corey Richardson, 2017-05-23 11:54:59

Eu gostaria de salientar aqui que esse aviso existe por uma razão e há uma boa chance da correção certa é {[[2]}não aumentar o limite, mas descobrir por que você está adicionando tantos ouvintes para o mesmo evento. Apenas aumente o limite se você sabe por que tantos ouvintes estão sendo adicionados e estão confiantes que é o que você realmente quer.

Encontrei esta página porque recebi este aviso e no meu caso havia um erro num código que estava a usar que estava a transformar o objecto global. para um evento! Eu certamente aconselharia a não aumentar o limite globalmente porque você não quer que essas coisas passem despercebidas.
 121
Author: voltrevo, 2015-07-16 00:18:18

Por padrão, um máximo de 10 ouvintes podem ser registrados para qualquer evento.

Se é o seu código, pode especificar os 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 teu código, podes usar o truque para aumentar o limite padrão globalmente:

require('events').EventEmitter.prototype._maxListeners = 100;
Claro que podes desligar os limites,mas tem cuidado.
// turn off limits by default (BE CAREFUL)
require('events').EventEmitter.prototype._maxListeners = 0;
[5] BTW. O código deve estar no início da aplicação.

Adicionar: dado que o nó 0.11, este código também funciona para alterar o valor por omissão limite:

require('events').EventEmitter.defaultMaxListeners = 0
 62
Author: zag2art, 2018-07-25 08:21:31

A resposta aceita fornece a semântica de como aumentar o limite, mas como @voltrevo apontou que o aviso está lá por uma razão e o 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 questões semelhantes no seu código antes de alterar os maxListeners (o que é explicado noutras respostas)

 30
Author: RLaaa, 2018-04-23 18:32:59

Substituir .on () with once(). a utilização do once () remove os ouvintes de eventos quando o evento é tratado pela mesma função. fonte: http://nodeguide.com/beginner.html#using-eventemitters

Se isto não resolver, reinstale a restler com isto no seu pacote.json "restler": "git:/ / github. com / danwrong / restler.git#9d455ff14c57ddbe263dbbcd0289d76413bfe07d"

Isto tem a ver com o restler 0.10 mau comportamento com o nó. você pode ver o assunto fechado no git aqui: https://github.com/danwrong/restler/issues/112 no entanto, o npm ainda tem que atualizar isso, então é por isso que você tem que se referir ao Git head.

[1] Happy restling:)
 13
Author: Davis Dulin, 2013-12-17 00:46:19
Também estou a receber este Aviso quando instalar o aglio no meu mac osx.

Uso cmd conserta-o.

sudo npm install -g npm@next

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

 3
Author: Legolas Bloom, 2016-09-28 01:46:02
No meu caso, era o que estava a ser chamado quando iniciava 10 (ou Mais) Casos da criança. Então qualquer coisa, que leva a anexar um manipulador de eventos para o mesmo objeto de evento em um LOOP, faz com que nodejs para jogar este erro.
 1
Author: Vikas Gautam, 2016-11-22 02:28:29
Às vezes estes avisos ocorrem quando não é algo que fizemos, mas algo que nos esquecemos de fazer!

Encontrei este Aviso quando instalei o pacote de dotenv com o npm, mas fui interrompido antes de começar a adicionar o necessário('dotenv').carregar () no início da minha aplicação. Quando voltei ao projeto, comecei a receber os avisos de "possível vazamento de memória EventEmitter detectado".

Eu presumi que o problema era de algo que eu tinha feito, não algo que eu não tinha feito! Assim que descobri a minha supervisão e adicionei a declaração necessária, o aviso de fuga de memória foi apagado.
 1
Author: Motate, 2017-01-21 18:59:10
Estava a ter isto até hoje, quando comecei. Finalmente resolvido por
watch:{
        options:{
            maxListeners: 99,
            livereload: true
        },
}
A mensagem irritante desapareceu.
 1
Author: Ariful Haque, 2017-05-11 06:51:25

Disseste que estavas a usar process.on('uncaughtException', callback);
Onde está a executar esta declaração? Está dentro do callback passado para http.createServer?
Se sim, uma cópia diferente do mesmo callback será anexada ao evento uncaughtException em cada novo pedido, porque o function (req, res) { ... } é executado sempre que um novo pedido entra, assim como a declaração process.on('uncaughtException', callback);
Note que o objeto de processo é global a todos os seus pedidos e adicionando ouvintes ao seu evento sempre que um novo pedido chega não faz sentido. Podes não querer esse tipo de comportamento.
no caso de querer anexar um novo ouvinte para cada novo pedido, deverá remover todos os ouvintes anteriores ligados ao evento, uma vez que já não seriam necessários usando:
process.removeAllListeners('uncaughtException');

 0
Author: Monish Chhadwa, 2016-07-06 13:41:16
A solução da nossa equipa para isto era remover um registo do nosso .npmrc. Tínhamos dois nomes falsos no ficheiro rc, e um apontava para um caso artificial que tinha sido desacreditado.

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

 0
Author: RossO, 2017-04-20 23:40:24
Estava a ter o mesmo problema. e o problema foi causado porque eu estava ouvindo a porta 8080, em 2 ouvintes.

setMaxListeners() funciona bem, mas não recomendo.

A forma correcta é verificar o seu código para ouvintes adicionais, remover o ouvinte ou alterar o número de porta em que está a ouvir, o que corrigiu o meu problema.

 0
Author: Noman Abid, 2018-01-24 12:35:06

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

 0
Author: maxpaj, 2018-02-08 07:27:43
Prefiro caçar e resolver problemas em vez de suprimir troncos sempre que possível. Depois de alguns dias observando este problema no meu aplicativo, percebi que estava colocando ouvintes no req.socket em um middleware Express para pegar os erros do socket io que continuavam aparecendo. A certa altura, aprendi que não era necessário, mas mantive os ouvintes por perto. Acabei de removê-los e o erro que estás a sentir desapareceu. Verifiquei que era a causa ao executar pedidos para o meu servidor. com e sem o middleware seguinte:
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 está a ver. Eu daria uma vista de olhos no seu código e tentaria encontrar qualquer lugar onde possa estar a criar ouvintes que não precise.
 0
Author: lwdthe1, 2018-08-12 13:47:05
Põe isto na primeira linha do teu servidor.js (ou o que quer que contenha o seu nó principal.js app):

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

E o erro desaparece:]

 -1
Author: Sebastian, 2016-02-10 13:02:19