node.js - increase - eventemitter nodejs
posible pérdida de memoria EventEmitter detectada (15)
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 declaración 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 declaración requerida, se borró la advertencia de pérdida de memoria.
Estoy recibiendo la siguiente advertencia:
(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)
Escribí un código como este en server.js:
http.createServer(
function (req, res) { ... }).listen(3013);
Cómo arreglar esto ?
Actualicé desde la antigua versión LTS, 6 algo, a la nueva versión LTS 8.9.4 y mis errores desaparecieron.
De forma predeterminada, se puede registrar un máximo de 10 oyentes para un solo evento. 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 aumentar 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;
PD. El código debe estar al principio de tu aplicación.
ADD: desde el nodo 0.11 esto también funciona para cambiar el límite predeterminado:
require(''events'').EventEmitter.defaultMaxListeners = 0
Dijiste que estás usando process.on(''uncaughtException'', callback);
¿Dónde estás ejecutando esta declaración? ¿Está dentro de la devolución de llamada pasada a http.createServer
?
Si es así, se adjuntará una copia diferente de la misma devolución de llamada 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);
declaración.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'');
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.
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.
Estaba teniendo esto hasta hoy cuando empiezo a grunt watch
. Finalmente resuelto por
watch:{
options:{
maxListeners: 99,
livereload: true
},
}
El mensaje molesto se fue.
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 ()"?
La respuesta aceptada proporciona la semántica sobre cómo aumentar 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)
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.
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 aumentar el límite a nivel mundial porque no quieres que estas cosas pasen desapercibidas.
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 :)
Prefiero cazar y solucionar problemas en lugar de eliminar 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.
Recibo esta advertencia también cuando instalo aglio en mi Mac OSX.
Yo uso cmd fix it.
sudo npm install -g npm@next
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 :)