Piszę kilka skryptów do manipulacji w wierszu poleceń Mangusta modele z commander.js (ostatecznie chciałbym uruchomić te narzędzia przy użyciu Cron).
Teraz napisałem kilka skryptów commander
i wszystkie działają dobrze, ale jeśli połączę się z bazą danych MongoDB za pomocą mongoose
, skrypt po prostu się zawiesza po zakończeniu. Teraz pomyślałem, że połączenie z bazą danych utrzymuje węzeł przy życiu, więc dodałem mongoose.disconnect()
linia i nadal się zawiesza.
Jedyne, co znalazłem, co pozwala mi się zamknąć, to użyć process.exit()
, ale nie chcę po prostu przerywać procesu. Czy jest coś szczególnego, co powinienem zrobić, aby uruchomić pełne wdzięku wyłączenie?
Odpowiedzi:
0 dla odpowiedzi № 1Moje czytanie Dokumenty API implikuje to .disconnect()
musi otrzymać funkcję oddzwaniania. Wygląda na to, że jest wywoływany dla każdego odłączonego i może zostać przekazany błąd.
Kod jest sprawdzany, aby upewnić się, że jestnie jest wywoływany, jeśli nie istnieje, gdy coś się kończy, ale ten test nie jest uruchamiany w przypadku błędów, więc jeśli Mongoose otrzymał komunikat o błędzie od klienta MongoDB, może pozostawić otwarte połączenie i dlatego „to” nie przerywa wykonywania.
Jeśli otwierasz tylko jedno połączenie z bazą danych, możesz po prostu zadzwonić [Connection object].close()
ponieważ ta funkcja poprawnie wstawia „oddzwanianie”, jeśli nie podano żadnego oddzwaniania, i wygląda na to, że poprawnie zniszczy rzeczy.
(Im więcej patrzę na Mongoose, tym bardziej chcę po prostu napisać cienkie opakowanie wokół klienta MongoDB, więc nie muszę zajmować się „pomocą” Mongoose.)
0 dla odpowiedzi nr 2
używam async „Seria”, aby wykonać operacje, a następnie wywołać mongoose.connection.close () po zakończeniu. Zapobiega piekłu zwrotnemu i pozwala starannie wykonywać operacje pojedynczo lub równolegle, po których następuje funkcja po zakończeniu wszystkich innych metod. Używam go cały czas w skryptach, które wymagają mangusty, ale mają zakończyć się po zakończeniu wszystkich operacji mangusty.
0 dla odpowiedzi № 3
Zamknij program węzła bezpośrednio ukrywa objawy, a nie rozwiązuje problemu!
W końcu wyizolowałem problem i znalazłem go w definicjach schematu Mongoose. Jeśli spróbujesz zamknąć połączenie zbyt wcześnie po zdefiniowaniu schematów Mongoose1, aplikacja zawiesza się i ostatecznie generuje jakiś dziwny błąd związany z MongDB.
Dodanie krótkiego limitu czasu przed uruchomieniem program.parse(argv)
Linia do uruchomienia aplikacji dowódcy rozwiązuje problem. Po prostu zawiń kod w następujący sposób:
var program = require("commander")
, mongoose = require("mongoose")
, models = null
;
// Define command line syntax.
program
.command(...)
;
mongoose.connect(
..., // connection parameters.
function() {
// connected to database, defined schemas.
models = require("./models");
// Wait 1 second before running the application code.
setTimeout(function(){
program.parser(process.argv);
}, 1000);
}
);
1: To jest moja początkowa interpretacja, ale (jeszcze) nie przetestowałem dokładnie tej teorii. Jednak usunięcie definicji schematu Mongoose z aplikacji uniemożliwia zawieszenie się aplikacji.
Właściwie to tylko za pomocą process.nextTick()
zamiast setTimeout()
połączenie ładnie naprawia sytuację!