2013-04-07 21 views
7

Ich schrieb ein Modul in node.js, die einige Netzwerkoperationen durchführt. Ich schrieb ein kleines Skript, das dieses Modul verwendet (die Variable check unten). Es sieht so aus:node.js: Programm wird entweder unerwartet beendet oder hängt einfach

check(obj, function (err, results) { 
    // ... 
    console.log("Check completed"); 
}); 

Jetzt ist hier die interessante Sache. Wenn dieser Code als Teil eines mocha-Tests ausgeführt wird, wird der Test wie erwartet beendet. Ich sehe die Log-Anweisung gedruckt und der Prozess beendet.

Wenn der Code als eigenständiges Knotenscript ausgeführt wird, wird die Protokollanweisung gedruckt, aber der Prozess hängt nur.

Wenn ich versuche, es zu debuggen und ich starte das Programm mit --debug-brk und node-inspector verwenden, wird es früh beendet! Ich sehe, dass process.on 'exit' aufgerufen wird. Es wird beendet, während einige interne Rückrufe innerhalb des Moduls noch nicht aufgerufen wurden. Daher wird die obige Protokollanweisung auch nicht gedruckt.

Ich bin jetzt stecken und bin mir nicht sicher, warum das passiert. Hat jemand ähnliches Verhalten gesehen?

Antwort

11

Wenn Sie es als Skript ausführen und es hängt, wenn "fertig" ist, bedeutet dies, dass auf dem Knoten noch Callbacks registriert sind, die auf Ereignisse warten. Der Knoten weiß nicht, dass diese Ereignisse nicht mehr ausgelöst werden. Sie können entweder einfach process.exit() anrufen, wenn Sie wissen, dass es Zeit zum Beenden ist, oder Sie können explizit alles schließen/trennen/trennen (Netzwerkverbindungen, Datenbankverbindungen usw.). Wenn Sie alles ordnungsgemäß schließen, sollte der Knoten beendet werden.

Das Modul wtfnode (von Nathan Arthur erwähnt) oder why-is-node-running kann wirklich hilfreich sein, dies zu verfolgen.

+5

Gibt es einen Weg herauszufinden, was Knoten offen hält? – Aishwar

+4

Wenn Sie über den Knoten-Inspector verfügen und diesen an den Prozess anhängen und einen Unterbrechungspunkt im Ereignis-Loop-Code des Knotens festlegen können. Ich habe nie einen dieser Fehler erfolgreich aufgespürt. Es sind entweder offensichtliche Dinge wie das Öffnen einer DB-Verbindung, aber niemals das explizite Schließen, oder ich mache einfach 'process.exit()' und mache mich mit meinem Leben weiter. –

+6

process._getActiveHandles() und process._getActiveRequests() siehe http://stackoverflow.com/questions/17960452/how-can-i-get-a-list-of-callbacks-in-the-node-work-queue -oder-warum-wont-node-ex – aaron

Verwandte Themen