Ich erhalte folgende Warnung:
(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)
Ich habe folgenden Code in server.js geschrieben:
http.createServer(
function (req, res) { ... }).listen(3013);
Wie kann ich das beheben?
process.on('warning', e => console.warn(e.stack));
diese Option, um die Warnung zu debuggen. Nicht verwenden,process.setMaxListeners(0);
da die Warnung aus irgendeinem Grund vorhanden ist.yarn install
. Wo kann ich diese Zeile einfügen, um eine Stapelverfolgung hinzuzufügen?Antworten:
Dies wird in der Dokumentation zum Knoten eventEmitter erläutert
Welche Version von Node ist das? Welchen anderen Code hast du? Das ist kein normales Verhalten.
Kurz gesagt, es ist:
process.setMaxListeners(0);
Siehe auch: node.js - request - Wie wird "emitter.setMaxListeners ()"?
quelle
process.on('uncaughtException', callback);
process.setMaxListeners(0); // OMG, its so simple... :D
Ich möchte hier darauf hinweisen, dass diese Warnung aus einem bestimmten Grund vorliegt und es eine gute Chance gibt, dass die richtige Lösung nicht vorhanden ist das Limit erhöht, sondern herausfindet, warum Sie dem gleichen Ereignis so viele Hörer hinzufügen. Erhöhen Sie das Limit nur, wenn Sie wissen, warum so viele Hörer hinzugefügt werden, und sicher sind, dass es das ist, was Sie wirklich wollen.
Ich habe diese Seite gefunden, weil ich diese Warnung erhalten habe und in meinem Fall ein Fehler in einem von mir verwendeten Code aufgetreten ist, der das globale Objekt in einen EventEmitter verwandelt hat! Ich würde auf jeden Fall davon abraten, das Limit global zu erhöhen, da Sie nicht möchten, dass diese Dinge unbemerkt bleiben.
quelle
Standardmäßig können maximal 10 Listener für ein einzelnes Ereignis registriert werden.
Wenn es Ihr Code ist, können Sie maxListeners angeben über:
Wenn es sich jedoch nicht um Ihren Code handelt, können Sie den Trick verwenden, um das Standardlimit global zu erhöhen:
Natürlich können Sie die Grenzen ausschalten, aber seien Sie vorsichtig:
Übrigens. Der Code sollte ganz am Anfang der App stehen.
HINZUFÜGEN: Seit Knoten 0.11 ändert dieser Code auch das Standardlimit:
quelle
Die akzeptierte Antwort enthält die Semantik zum Erhöhen des Grenzwerts. Wie @voltrevo jedoch darauf hinwies, gibt es eine Warnung aus einem bestimmten Grund und Ihr Code weist wahrscheinlich einen Fehler auf.
Betrachten Sie den folgenden Buggy-Code:
Beobachten Sie nun die richtige Art, den Listener hinzuzufügen:
Suchen Sie nach ähnlichen Problemen in Ihrem Code, bevor Sie die maxListeners ändern (was in anderen Antworten erläutert wird).
quelle
Ersetzen
.on()
durchonce()
. Verwenden vononce()
wird Ereignis-Listener entfernt, wenn das Ereignis von derselben Funktion behandelt wird.Wenn dies das Problem nicht behebt, installieren Sie restler damit in Ihrem package.json "restler" neu: "git: //github.com/danwrong/restler.git#9d455ff14c57ddbe263dbbcd0289d76413bfe07d"
Dies hat mit dem Fehlverhalten von Restler 0.10 gegenüber dem Knoten zu tun. Sie können das auf git geschlossene Problem hier sehen: https://github.com/danwrong/restler/issues/112 npm muss dies jedoch noch aktualisieren, weshalb Sie sich auf den git-Kopf beziehen müssen.
quelle
Ich erhalte diese Warnung auch, wenn ich aglio auf meinem Mac OSX installiere.
Ich benutze cmd fix it.
https://github.com/npm/npm/issues/13806
quelle
Knotenversion: v11.10.1
Warnmeldung vom Stack-Trace:
Nach der Suche nach Github-Problemen, der Dokumentation und dem Erstellen ähnlicher Speicherverluste bei Ereignisemittern wurde dieses Problem aufgrund des für die iOS-Push-Benachrichtigung verwendeten Node-Apn- Moduls beobachtet .
Dies löste es:
Ich habe jedes Mal, wenn die Benachrichtigung gesendet wurde, ein Provider-Objekt erstellt und erwartet, dass der GC es löscht.
quelle
In meinem Fall wurde es
child.stderr.pipe(process.stderr)
aufgerufen, als ich 10 (oder so) Instanzen des Kindes initiierte. Alles, was dazu führt, dass ein Event-Handler in einer LOOP an dasselbe EventEmitter-Objekt angehängt wird, führt dazu, dass nodejs diesen Fehler auslöst.quelle
Manchmal treten diese Warnungen auf, wenn wir nicht etwas getan haben, sondern etwas vergessen haben!
Diese Warnung trat auf, als ich das dotenv-Paket mit npm installierte, wurde jedoch unterbrochen, bevor ich die Anweisung require ('dotenv'). Load () am Anfang meiner App hinzufügte. Als ich zum Projekt zurückkehrte, wurden die Warnungen "Möglicher EventEmitter-Speicherverlust erkannt" angezeigt.
Ich nahm an, dass das Problem von etwas herrührte, das ich getan hatte, nicht von etwas, das ich nicht getan hatte!
Sobald ich mein Versehen entdeckt und die require-Anweisung hinzugefügt hatte, wurde die Speicherverlustwarnung gelöscht.
quelle
Ich ziehe es vor, Probleme zu suchen und zu beheben, anstatt Protokolle zu unterdrücken, wann immer dies möglich ist. Nachdem ich dieses Problem einige Tage lang in meiner App beobachtet hatte, stellte ich fest, dass ich
req.socket
in einer Express-Middleware Listener für die Socket-Io-Fehler einstellte , die immer wieder auftauchten. Irgendwann habe ich gelernt, dass das nicht nötig ist, aber ich habe die Zuhörer trotzdem behalten. Ich habe sie gerade entfernt und der Fehler, den Sie haben, ist verschwunden. Ich habe überprüft, ob dies die Ursache ist, indem ich Anforderungen an meinen Server mit und ohne die folgende Middleware ausgeführt habe:Durch das Entfernen dieser Middleware wurde die angezeigte Warnung gestoppt. Ich würde mich in Ihrem Code umsehen und versuchen, einen Ort zu finden, an dem Sie möglicherweise Listener einrichten, die Sie nicht benötigen.
quelle
Ich hatte das gleiche Problem. und das Problem wurde verursacht, weil ich Port 8080 auf 2 Listenern hörte.
setMaxListeners()
funktioniert gut, aber ich würde es nicht empfehlen.Der richtige Weg ist, Ihren Code auf zusätzliche Listener zu überprüfen, den Listener zu entfernen oder die Portnummer zu ändern, die Sie abhören. Dies hat mein Problem behoben.
quelle
Ich hatte das bis heute, als ich anfing
grunt watch
. Endlich gelöst vonDie nervige Nachricht ist weg.
quelle
Sie müssen alle Listener löschen, bevor Sie neue erstellen können, indem Sie:
Kundenserver
Angenommen, Socket ist Ihr Client-Socket oder der erstellte Server-Socket.
Sie können auch bestimmte Ereignis-Listener abonnieren, z. B. den
connect
Listener wie folgt entfernen :quelle
Sie sagten, Sie verwenden
process.on('uncaughtException', callback);
Wo führen Sie diese Anweisung aus? Wird es innerhalb des Rückrufs weitergeleitet
http.createServer
?Wenn ja, wird verschiedene Kopie des gleichen Rückrufs an dem beigefügten erhalten uncaughtException bei jeder neuen Anforderung Ereignis, weil die
function (req, res) { ... }
Ausführung jedes Mal wird eine neue Anforderung kommt und so wird die Aussage zuprocess.on('uncaughtException', callback);
beachten , dass das Prozessobjekt ist global für alle Ihre Anfragen und das Hinzufügen von Hörern Jedes Mal, wenn eine neue Anfrage eingeht, ergibt dies keinen Sinn. Möglicherweise möchten Sie ein solches Verhalten nicht.
Wenn Sie für jede neue Anforderung einen neuen Listener anhängen möchten, sollten Sie alle vorherigen Listener entfernen, die an das Ereignis angehängt sind, da sie nicht mehr benötigt werden, indem Sie:
process.removeAllListeners('uncaughtException');
quelle
Die Lösung unseres Teams bestand darin, einen Registrierungspfad aus unserer .npmrc zu entfernen. Wir hatten zwei Pfad-Aliase in der RC-Datei, und einer zeigte auf eine veraltete Artifactory-Instanz.
Der Fehler hatte nichts mit dem tatsächlichen Code unserer App zu tun, sondern alles mit unserer Entwicklungsumgebung.
quelle
Ich hatte das gleiche Problem, aber ich habe erfolgreich mit async warten gewartet.
Bitte überprüfen Sie, ob es hilft.
let dataLength = 25;
Vorher:
for (sei i = 0; i <dataLength; i ++) {
sftp.get (remotePath, fs.createWriteStream (
xyzProject/${data[i].name}
));}
After:
for (sei i = 0; i <dataLength; i ++) {
warte auf sftp.get (remotePath, fs.createWriteStream (
xyzProject/${data[i].name}
));}}
quelle
Vielen Dank an RLaaa für die Idee, wie ich das eigentliche Problem / die Grundursache der Warnung lösen kann. In meinem Fall war es MySQL-Buggy-Code.
Vorausgesetzt, Sie haben ein Versprechen mit Code geschrieben:
Beachten Sie, dass
conn.on('error')
der Code einen Listener enthält. Dieser Code, der buchstäblich immer wieder Listener hinzufügt, hängt davon ab, wie oft Sie die Abfrage aufrufen. Inzwischenif(err) reject(err)
macht das gleiche.Also habe ich den
conn.on('error')
Listener entfernt und voila ... gelöst! Hoffe das hilft dir.quelle
Fügen Sie dies in die erste Zeile Ihrer server.js ein (oder was auch immer Ihre Haupt-Node.js-App enthält):
require('events').EventEmitter.prototype._maxListeners = 0;
und der Fehler verschwindet :)
quelle