/ / Mongoose e comandante - node.js, mongodb, mongoose

Mongoose e comandante - node.js, mongodb, mangusta

Sto scrivendo alcuni script per la manipolazione della riga di comando di Mangusta modelli con commander.js (eventualmente, mi piacerebbe eseguire questi strumenti usando cron).

Ora, ho scritto diversi script con commander e funzionano tutti bene, ma se mi connetto al database MongoDB usando mongoose, lo script si blocca solo dopo averlo fatto. Ora, ho pensato che la connessione al database mantenga il nodo in vita, quindi ho aggiunto un mongoose.disconnect() linea e si blocca ancora.

L'unica cosa che ho trovato che mi permette di spegnere è usare process.exit(), ma sono riluttante a terminare il processo. C'è qualcosa in particolare che dovrei fare per innescare un arresto grazioso?

risposte:

0 per risposta № 1

La mia lettura del Documenti API implica che .disconnect() dovere ricevere una funzione di callback. Sembra che sia stato chiamato per ognuno che è disconnesso e potrebbe essere passato un errore.

C'

Se stai aprendo solo una singola connessione al database, potresti semplicemente chiamare [Connection object].close() poiché quella funzione inserisce correttamente un "callback" no-op se non viene dato alcun callback, e sembra che distruggerà correttamente le cose.

(Più guardo in Mongoose, più voglio scrivere solo un sottile involucro attorno al client MongoDB in modo da non dover gestire l "aiuto" di Mongoose.)


0 per risposta № 2

Io uso il async "Serie" per eseguire operazioni e quindi chiamare mongoose.connection.close () al termine. Previene l'inferno di callback e consente di eseguire ordinatamente operazioni una alla volta o in parallelo seguite da una funzione quando tutti gli altri metodi sono stati completati. Lo uso sempre per gli script che richiedono mangusta ma che dovrebbero terminare dopo che tutte le operazioni di mangusta sono finite.


0 per risposta № 3

L'arresto diretto del programma del nodo nasconde i sintomi, non risolve il problema!

Alla fine ho isolato il problema e ho scoperto che era con le definizioni dello schema Mongoose. Se si tenta di chiudere la connessione troppo presto dopo aver definito gli schemi di Mongoose1, l'applicazione si blocca e alla fine produce uno strano errore relativo a MongDB.

Aggiungendo un piccolo timeout prima di eseguire il file program.parse(argv) riga per eseguire l'applicazione comandante risolve il problema. Basta avvolgere il codice in questo modo:

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: Questa è la mia interpretazione iniziale, non ho (ancora) ampiamente testato questa teoria. Tuttavia, la rimozione delle definizioni dello schema Mongoose dall'applicazione impedisce il blocco dell'applicazione.


In realtà, sto solo usando process.nextTick() invece del setTimeout() chiamata risolve bene la situazione!