Recibo 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 ?
process.on('warning', e => console.warn(e.stack));
para depurar la advertencia. No lo useprocess.setMaxListeners(0);
ya que la advertencia está ahí por alguna razón.yarn install
. ¿Dónde puedo poner esta línea para agregar seguimiento de pila?Respuestas:
Esto se explica en la documentación del nodo eventEmitter
¿Qué versión de Node es esta? ¿Qué otro código tienes? Ese no es un comportamiento normal.
En resumen, es:
process.setMaxListeners(0);
Ver también: node.js - request - ¿Cómo “emitter.setMaxListeners ()”?
fuente
process.on('uncaughtException', callback);
process.setMaxListeners(0); // OMG, its so simple... :D
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 descubra 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 está seguro de 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 que estaba convirtiendo el objeto global en un EventEmitter! Sin duda aconsejaría no aumentar el límite globalmente porque no desea que estas cosas pasen desapercibidas.
fuente
De manera predeterminada, 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:
Pero si no es su código, puede usar el truco para aumentar el límite predeterminado globalmente:
Por supuesto, puede desactivar los límites, pero tenga cuidado:
Por cierto. El código debe estar al comienzo de la aplicación.
AGREGAR: desde el nodo 0.11, este código también funciona para cambiar el límite predeterminado:
fuente
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 su código probablemente tenga un error.
Considere el siguiente código con errores:
Ahora observe la forma correcta de agregar el oyente:
Busque problemas similares en su código antes de cambiar maxListeners (que se explica en otras respuestas)
fuente
Reemplazar
.on()
cononce()
. Utilizandoonce()
elimina oyentes de eventos cuando el evento es manejado por la misma función.Si esto no lo soluciona, vuelva a instalar restler con esto en su package.json "restler": "git: //github.com/danwrong/restler.git#9d455ff14c57ddbe263dbbcd0289d76413bfe07d"
Esto tiene que ver con el restler 0.10 portándose mal con el nodo. puedes ver el problema cerrado en git aquí: https://github.com/danwrong/restler/issues/112 Sin embargo, npm aún no ha actualizado esto, por eso debes consultar el encabezado de git.
fuente
También recibo esta advertencia cuando instalo aglio en mi mac osx.
Yo uso cmd arreglarlo.
https://github.com/npm/npm/issues/13806
fuente
Versión de nodo: v11.10.1
Mensaje de advertencia del seguimiento de la pila:
Después de buscar problemas de github, documentación y crear fugas de memoria de emisor de eventos similares, este problema se observó debido al módulo node-apn utilizado para la notificación push de iOS.
Esto lo resolvió:
Estaba creando un objeto de proveedor cada vez que se enviaba la notificación y esperaba que el gc la borrara.
fuente
En mi caso, era lo
child.stderr.pipe(process.stderr)
que se llamaba cuando estaba iniciando 10 (más o menos) instancias del niño. Entonces, cualquier cosa, que lleve a adjuntar un controlador de eventos al mismo objeto EventEmitter en un LOOP, hace que nodejs arroje este error.fuente
¡Algunas 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 fui interrumpido antes de agregar la declaración require ('dotenv'). Load () al comienzo de mi aplicación. Cuando volví al proyecto, comencé a recibir las advertencias "Posible evento de fuga de memoria detectada en el emisor".
¡Supuse que el problema era de algo que había hecho, no de algo que no había hecho!
Una vez que descubrí mi descuido y agregué la declaración require, se borró la advertencia de pérdida de memoria.
fuente
Prefiero buscar y solucionar problemas en lugar de suprimir registros siempre que 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
middleware Express para detectar errores de socket io que seguían apareciendo. En algún momento, aprendí que eso no era necesario, pero de todos modos mantuve a los oyentes cerca. Simplemente los eliminé y el error que estás experimentando desapareció. Verifiqué que era la causa al ejecutar solicitudes a mi servidor con y sin el siguiente middleware:La eliminación de ese middleware detuvo la advertencia que está viendo. Buscaría su código e intentaría encontrar cualquier lugar en el que esté configurando oyentes que no necesita.
fuente
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 su código en busca de oyentes adicionales, eliminar el oyente o cambiar el número de puerto en el que está escuchando, esto solucionó mi problema.
fuente
Estaba teniendo esto hasta hoy cuando empiezo
grunt watch
. Finalmente resuelto porEl mensaje molesto se ha ido.
fuente
Debe borrar todos los oyentes antes de crear nuevos usando:
Servidor de cliente
Suponiendo que el socket es el socket de su cliente / o el socket del servidor creado.
También puede suscribirse desde oyentes de eventos específicos, como por ejemplo eliminar al
connect
oyente de esta manera:fuente
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
?En caso afirmativo, se adjuntará una copia diferente de la misma devolución de llamada al evento uncaughtException en cada nueva solicitud, porque
function (req, res) { ... }
se ejecuta cada vez que entra una nueva solicitud y también lo hará la declaraciónprocess.on('uncaughtException', callback);
Tenga en cuenta que el objeto de proceso es global para todas sus solicitudes y agrega oyentes para su evento cada vez que llega 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 utilizando:
process.removeAllListeners('uncaughtException');
fuente
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 en desuso.
El error no tiene nada que ver con el código real de nuestra aplicación, pero todo que ver con nuestro entorno de desarrollo.
fuente
Estaba enfrentando el mismo problema, pero lo he manejado con éxito con async en espera.
Por favor, compruebe si ayuda.
let dataLength = 25;
Antes:
for (let i = 0; i <dataLength; i ++) {
sftp.get (remotePath, fs.createWriteStream (
xyzProject/${data[i].name}
));}
Después:
for (let i = 0; i <dataLength; i ++) {
await sftp.get (remotePath, fs.createWriteStream (
xyzProject/${data[i].name}
));}
fuente
Gracias a RLaaa por darme una idea de cómo resolver el problema real / la causa raíz de la advertencia. Bueno, en mi caso fue el código de error MySQL.
Siempre que haya escrito una Promesa con un código como este:
Observe que hay un
conn.on('error')
oyente en el código. Ese código que literalmente agrega oyente una y otra vez depende de cuántas veces llame a la consulta. Mientras tantoif(err) reject(err)
hace lo mismo.Así que eliminé el
conn.on('error')
oyente y listo ... ¡resuelto! Espero que esto te ayude.fuente
Ponga esto en la primera línea de su server.js (o lo que sea que contenga su aplicación principal Node.js):
require('events').EventEmitter.prototype._maxListeners = 0;
y el error desaparece :)
fuente