2013-04-07 12 views
7

Napisałem moduł w pliku node.js, który wykonuje niektóre operacje sieciowe. Napisałem mały skrypt wykorzystujący ten moduł (poniżej zmienna check). Wygląda to tak:node.js: program albo nieoczekiwanie wychodzi, albo po prostu zawiesza się

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

Tutaj jest interesująca rzecz. Kiedy ten kod jest wykonywany jako część testu mocha, test kończy się zgodnie z oczekiwaniami. Widzę wydruk dziennika i proces się kończy.

Gdy kod zostanie wykonany jako samodzielny skrypt węzła, instrukcja dziennika zostanie wydrukowana, ale proces się zawiesi.

Kiedy próbuję debugować i uruchomić program przy użyciu --debug-brk i użyć node-inspector, wychodzi wcześniej! Widzę, że jest wywoływany process.on 'exit'. Kończy się, podczas gdy niektóre wewnętrzne wywołania zwrotne w module nie są jeszcze wywoływane. Tak więc powyższe zestawienie dziennika nie jest drukowane.

Utknąłem teraz i nie jestem pewien, dlaczego tak się dzieje. Czy ktoś widział podobne zachowanie?

Odpowiedz

11

Po uruchomieniu go jako skryptu i zawiesza się po "done", oznacza to, że węzeł nadal ma wywołania zwrotne oczekujące na zdarzenia. Węzeł nie wie, że te zdarzenia nie będą już uruchamiane. Możesz zadzwonić pod numer process.exit(), jeśli wiesz, że nadszedł czas, aby wyjść, lub możesz jawnie zamknąć/odłączyć/odłączyć wszystko (połączenia sieciowe, połączenia db, itp.). Jeśli wszystko poprawnie zamkniesz, węzeł powinien wyjść.

Moduł (wspomniany przez Nathan Arthur) lub why-is-node-running może być bardzo pomocny przy śledzeniu tego.

+5

Czy jest jakiś sposób, aby dowiedzieć się, co trzyma węzeł otwarty? – Aishwar

+4

Jeśli masz inspektora węzłów i możesz dołączyć do procesu i ustawić punkt przerwania w pętli zdarzeń węzła, być może. Nigdy nie udało mi się wytropić jednego z nich. Jest to albo oczywiste rzeczy, takie jak otwarcie połączenia DB, ale nigdy jawnie zamknięcia go, lub po prostu wykonaj 'process.exit()' i zabrać się za moje życie. –

+6

process._getActiveHandles() i process._getActiveRequests() patrz http://stackoverflow.com/questions/17960452/how-can-i-get-a-list-callbacks-in-the-node-work-queue -lub-why-wont-node-ex – aaron

Powiązane problemy