En algunas ocasiones específicas, si el programador no tiene cuidado, Node.js genera la siguiente advertencia: (node:11548) MaxListenersExceededWarning: Possible EventEmitter memory leak detected , pero el proceso continúa ejecutándose y este mensaje se pierde en la salida de la consola durante la inicialización , ¿hay alguna forma en que el proceso de inicialización pueda detectar este mensaje de advertencia para no continuar con la inicialización si ocurre? Gracias por adelantado.
Ese mensaje específico está allí porque, a menudo, cuando excede el nivel de advertencia predeterminado para la cantidad de oyentes de un eventEmitter específico, esto es una señal de que hay algún tipo de "fuga" de oyentes donde está agregando oyentes de una manera que se acumulan arriba (no usarlos correctamente). El nivel predeterminado para esta advertencia es 10.
Por lo tanto, generalmente vale la pena depurar la causa de esta advertencia y comprender si es una advertencia legítima (una señal de un problema real) o una advertencia falsa (no causada por un problema real).
Si sabe de qué eventEmitter proviene y se ha convencido de que no hay un problema real aquí, entonces puede aumentar el límite que causa la advertencia con:
emitter.setMaxListeners(30); // pick whatever limit is appropriatePuede ver el documento para ese método aquí .
Puede captar esta advertencia en particular con este código :
process.on('warning', warningInfo => { // examine the warning here and decide what to do console.log(warningInfo); });Puede demostrar el problema con este sencillo programa node.js:
const EventEmitter = require('events'); const e = new EventEmitter(); // create one more listener for the same event than the default // warning limit for (let i = 0; i < 11; i++) { e.on("greeting", () => { console.log("greeting"); }); } // listen for the warning process.on('warning', info => { console.log(info); });Una de las formas de detectar errores es siempre try and catch .
Siempre puede detectar excepciones no detectadas con node.js haciendo
process.on('uncaughtException', err => { console.error('There was an uncaught error', err) process.exit(1) //mandatory (as per the Node.js docs) })