2013-04-07 24 views
7

Ho scritto un modulo in node.js che esegue alcune operazioni di rete. Ho scritto un piccolo script che utilizza questo modulo (la variabile check di seguito). Assomiglia a questo:node.js: il programma si chiude in modo imprevisto o si blocca semplicemente

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

Ora ecco la cosa interessante. Quando questo codice viene eseguito come parte di un test mocha, il test termina come previsto. Vedo la dichiarazione del registro stampata e il processo termina.

Quando il codice viene eseguito come script nodo autonomo, l'istruzione del registro viene stampata, ma il processo si blocca.

Quando provo a eseguire il debug e avvio il programma utilizzando --debug-brk e utilizzo node-inspector, si esce presto! Vedo che viene chiamato process.on 'exit'. Esce mentre alcuni callback interni al modulo non sono stati ancora chiamati. Quindi la dichiarazione di registro qui sopra non viene stampata neanche.

Sono bloccato e non sono sicuro del motivo per cui questo sta accadendo. Qualcuno ha visto un comportamento simile?

risposta

11

Quando lo si esegue come uno script e si blocca quando "finito", significa che il nodo ha ancora callback registrati in attesa di eventi. Il nodo non sa che quegli eventi non spareranno più. Puoi chiamare semplicemente process.exit() se sai che è ora di uscire, oppure puoi chiudere/disconnettere esplicitamente/disconnettere tutto (connessioni di rete, connessioni db, ecc.). Se si chiude correttamente tutto, il nodo deve quindi uscire.

Il modulo wtfnode (citato da Nathan Arthur) o why-is-node-running può essere davvero utile rintracciarlo.

+5

C'è qualche modo per scoprire cosa mantiene aperto il nodo? – Aishwar

+4

Se si dispone di ispettore nodo e si può collegare al processo e impostare un punto di interruzione nel codice del ciclo di eventi del nodo, forse. Non ho mai seguito correttamente uno di questi. È ovvio che cose come aprire una connessione DB ma non chiuderlo mai esplicitamente, o faccio semplicemente 'process.exit()' e andare avanti con la mia vita. –

+6

process._getActiveHandles() e process._getActiveRequests() vedere http://stackoverflow.com/questions/17960452/how-can-i-get-a-list-of-callbacks-in-the-node-work-queue -o-perché-wont-node-ex – aaron