/ / Mongoose and commander - node.js, mongodb, mongoose

Mongoose i dowódca - node.js, mongodb, mangusta

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 № 1

Moje 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ę!