posible pérdida de memoria EventEmitter detectada

Estoy recibiendo la siguiente advertencia:

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

Escribí un código como este en server.js:

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

Cómo arreglar esto ?

Esto se explica en el manual: http://nodejs.org/docs/latest/api/events.html#events_emitter_setmaxlisteners_n

¿Qué versión de Node es esto? ¿Qué otro código tienes? Ese no es un comportamiento normal.

En resumen, es: process.setMaxListeners(0);

Consulte también: node.js – request – Cómo “emitter.setMaxListeners ()”?

Me gustaría señalar aquí que esa advertencia está ahí por una razón y hay una buena posibilidad de que la solución correcta no aumente el límite, sino que averigüe por qué está agregando tantos oyentes al mismo evento. Solo aumente el límite si sabe por qué se están agregando tantos oyentes y confía en que es lo que realmente desea.

Encontré esta página porque recibí esta advertencia y en mi caso había un error en algún código que estaba usando y que convertía el objeto global en un EventEmitter. Ciertamente desaconsejaría boost el límite a nivel mundial porque no quieres que estas cosas pasen desapercibidas.

Por defecto, se puede registrar un máximo de 10 oyentes para cualquier evento individual.

Si es su código, puede especificar maxListeners a través de:

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

Pero si no es su código, puede usar el truco para boost el límite predeterminado globalmente:

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

Por supuesto, puede desactivar los límites, pero tenga cuidado:

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

Por cierto. El código debe estar al principio de la aplicación.

ADD: Desde el nodo 0.11, este código también funciona para cambiar el límite predeterminado:

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

La respuesta aceptada proporciona la semántica sobre cómo boost el límite, pero como @voltrevo señaló que la advertencia está ahí por una razón y que su código probablemente tenga un error.

Considere el siguiente código 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'); } 

Ahora observe la forma correcta de agregar al oyente:

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

Busque problemas similares en su código antes de cambiar los maxListeners (lo que se explica en otras respuestas)

reemplace .on () por una vez (). al usar once () se eliminan los detectores de eventos cuando el evento es manejado por la misma función. fuente: http://nodeguide.com/beginner.html#using-eventemitters

si esto no lo soluciona, vuelva a instalar restler con esto en su paquete.json “restler”: “git: //github.com/danwrong/restler.git#9d455ff14c57ddbe263dbbcd0289d76413bfe07d”

esto tiene que ver con restler 0.10 portándose mal con node. puede ver el problema cerrado en git aquí: https://github.com/danwrong/restler/issues/112 sin embargo, npm aún tiene que actualizar esto, por lo que es necesario consultar el git head.

feliz descanso 🙂

Recibo esta advertencia también cuando instalo aglio en mi Mac OSX.

Yo uso cmd fix it.

 sudo npm install -g npm@next 

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

En mi caso, fue child.stderr.pipe(process.stderr) que se llamaba cuando estaba iniciando 10 (más o menos) instancias del niño. Entonces, cualquier cosa que conduzca a conectar un controlador de eventos al mismo objeto EventEmitter en un LOOP, hace que nodejs arroje este error.

A veces, estas advertencias ocurren cuando no es algo que hemos hecho, sino algo que hemos olvidado hacer.

Encontré esta advertencia cuando instalé el paquete dotenv con npm, pero me interrumpieron antes de agregar la statement require (‘dotenv’). Load () al principio de mi aplicación. Cuando volví al proyecto, comencé a recibir las advertencias de “Detección de fuga de memoria posible de EventEmitter”.

¡Supuse que el problema era por algo que había hecho, no algo que no había hecho!

Una vez que descubrí mi supervisión y agregué la statement requerida, se borró la advertencia de pérdida de memoria.

Estaba teniendo esto hasta hoy cuando empiezo a grunt watch . Finalmente resuelto por

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

El mensaje molesto se fue.

Dijiste que estás usando process.on('uncaughtException', callback);
¿Dónde estás ejecutando esta statement? ¿Está dentro de la callback pasada a http.createServer ?
Si es así, se adjuntará una copia diferente de la misma callback al evento uncaughtException en cada nueva solicitud, porque la function (req, res) { ... } se ejecuta cada vez que entra una nueva solicitud y también lo hace el process.on('uncaughtException', callback); statement.on process.on('uncaughtException', callback);
Tenga en cuenta que el objeto de proceso es global para todas sus solicitudes y agregar oyentes a su evento cada vez que ingrese una nueva solicitud no tendrá ningún sentido. Es posible que no desee ese tipo de comportamiento.
En caso de que desee adjuntar un nuevo oyente para cada nueva solicitud, debe eliminar todos los oyentes anteriores adjuntos al evento, ya que ya no serían necesarios mediante:
process.removeAllListeners('uncaughtException');

La solución de nuestro equipo para esto fue eliminar una ruta de registro de nuestro .npmrc. Teníamos dos alias de ruta en el archivo rc, y uno apuntaba a una instancia de Artifactory que había quedado obsoleta.

El error no tuvo nada que ver con el código real de nuestra aplicación, sino con todo lo relacionado con nuestro entorno de desarrollo.

Estaba teniendo el mismo problema. y el problema fue causado porque estaba escuchando el puerto 8080, en 2 oyentes.

setMaxListeners() funciona bien, pero no lo recomendaría.

la forma correcta es verificar el código para detectar oyentes adicionales, eliminar el oyente o cambiar el número de puerto en el que está escuchando, esto solucionó mi problema.

Actualicé desde la antigua versión LTS, 6 algo, a la nueva versión LTS 8.9.4 y mis errores desaparecieron.

Prefiero buscar y solucionar problemas en lugar de suprimir registros cuando sea posible. Después de un par de días de observar este problema en mi aplicación, me di cuenta de que estaba configurando oyentes en el req.socket de req.socket En un middleware Express para detectar los errores de socket que seguían apareciendo. En algún momento, aprendí que eso no era necesario, pero de todos modos mantuve a los oyentes alrededor. Simplemente los eliminé y el error que experimentas desapareció. Comprobé que era la causa al ejecutar solicitudes a mi servidor con y sin el siguiente 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(); } 

La eliminación de ese middleware detuvo la advertencia que está viendo. Revisaría su código e intentaría encontrar sitios donde pueda configurar oyentes que no necesita.

Pon esto en la primera línea de tu server.js (o lo que sea que contenga tu aplicación principal Node.js):

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

y el error desaparece 🙂