Al termine, chiudere correttamente la connessione della mangusta


145

Sto usando la mangusta in uno script che non è pensato per essere eseguito continuamente, e sto affrontando quello che sembra essere un problema molto semplice, ma non riesco a trovare una risposta; semplicemente una volta che faccio una chiamata a qualsiasi funzione mongoose che invia richieste a mongodb la mia istanza nodejs non si ferma mai e devo ucciderla manualmente con, diciamo, Ctrl + c o Program.exit ().

Il codice è simile al seguente:

var mongoose = require('mongoose');

// if my program ends after this line, it shuts down as expected, my guess is that the connection is not really done here but only on the first real request ?
mongoose.connect('mongodb://localhost:27017/somedb'); 

// define some models

// if I include this line for example, node never stop afterwards
var MyModel =  mongoose.model('MyModel', MySchema);

Ho provato ad aggiungere chiamate a mongoose.disconnect () ma no per ottenere risultati. A parte questo, tutto funziona bene (trovare, salvare, ...).

Questo è esattamente lo stesso problema di questa persona, purtroppo non ha ricevuto alcuna risposta: https://groups.google.com/group/mongoose-orm/browse_thread/thread/c72cc1c51c76e661

Grazie

EDIT: ha accettato la risposta di seguito poiché è tecnicamente corretta, ma se qualcuno dovesse mai più risolvere questo problema, sembra che mongoose e / o il driver mongodb in realtà non chiudano la connessione quando lo si chiede se ci sono ancora query in esecuzione.

Non ricorda nemmeno la chiamata di disconnessione, non lo fa una volta terminata l'esecuzione delle query; ignora semplicemente la tua chiamata senza alcuna eccezione o qualcosa del genere e non chiude mai effettivamente la connessione.

Quindi il gioco è fatto: assicurati che ogni query sia stata elaborata prima di chiamare disconnect () se vuoi che funzioni davvero.


1
C'è un modo per farlo solo importando un modello? nessuna delle risposte seguenti funziona: \
Anthony

Risposte:


201

È possibile chiudere la connessione con

mongoose.connection.close()

25
Questo infatti chiude la connessione. Tuttavia, questa chiamata stava cancellando i contenuti nel mio database. Quando sono passato a mongoose.disconnect () tutto ha funzionato correttamente e i miei test moka hanno ripreso a funzionare correttamente
Brian Noah,

1
Questo ha funzionato per me. Avevo solo bisogno di assicurarmi di averlo inserito nel callback corretto, altrimenti probabilmente stava chiudendo la connessione prima che il salvataggio nel database potesse finire. Ad essere sinceri, sto ancora usando un semplice script che si collega al db locale e salva un semplice oggetto utente di esempio. Nel callback a user.save () è dove chiamo mongoose.connection.close ().
FateNuller,

6
Come puoi vedere, queste risposte sono vecchie. Se stai usando Mongoose 5.0.4 , il Connection.close()metodo viene solo esportato, disponibile solo, quindi usalo.
Константин Ван

74

L'altra risposta non ha funzionato per me. Ho dovuto usare mongoose.disconnect();come indicato in questa risposta .


Questo è anche preferito quando si abbatte un ambiente di test.
Matt Lo

1
mongoose.disconnect () è meglio usare e un approccio logico.
Abdul Alim Shakir

17

È possibile impostare la connessione su una variabile, quindi disconnetterla al termine:

var db = mongoose.connect('mongodb://localhost:27017/somedb');

// Do some stuff

db.disconnect();

Nella mia situazione (testare Mongoose dentro Jest) questa è l'unica soluzione che ha funzionato
Code Whisperer,

Faccio Model.update (..) con Mongoose in un for-loop. È necessario chiudere la connessione dopo ogni aggiornamento? Il mio server deve gestire molti aggiornamenti e ha smesso di funzionare dopo un po '.
Pille,

Stessa risposta di seguito
Daniel W.

3

Sto usando la versione 4.4.2 e nessuna delle altre risposte ha funzionato per me. Ma aggiungendo useMongoClientalle opzioni e inserendola in una variabile su cui si chiama closesembrava funzionare.

var db = mongoose.connect('mongodb://localhost:27017/somedb', { useMongoClient: true })

//do stuff

db.close()

1

Verrà visualizzato un errore se si tenta di chiudere / disconnettersi al di fuori del metodo. La soluzione migliore è chiudere la connessione in entrambi i callback nel metodo. Il codice fittizio è qui.

const newTodo = new Todo({text:'cook dinner'});

newTodo.save().then((docs) => {
  console.log('todo saved',docs);
  mongoose.connection.close();
},(e) => {
  console.log('unable to save');
});

1

Proprio come ha detto Jake Wilson: è possibile impostare la connessione su una variabile, quindi disconnetterla al termine:

let db;
mongoose.connect('mongodb://localhost:27017/somedb').then((dbConnection)=>{
    db = dbConnection;
    afterwards();
});


function afterwards(){

    //do stuff

    db.disconnect();
}

o se all'interno della funzione Async:

(async ()=>{
    const db = await mongoose.connect('mongodb://localhost:27017/somedb', { useMongoClient: 
                  true })

    //do stuff

    db.disconnect()
})

altrimenti quando lo stavo controllando nel mio ambiente ha un errore.


0

Probabilmente hai questo:

const db = mongoose.connect('mongodb://localhost:27017/db');

// Do some stuff

db.disconnect();

ma puoi anche avere qualcosa del genere:

mongoose.connect('mongodb://localhost:27017/db');

const model = mongoose.model('Model', ModelSchema);

model.find().then(doc => {
  console.log(doc);
}

non è possibile chiamare db.disconnect()ma è possibile chiudere la connessione dopo averla utilizzata.

model.find().then(doc => {
  console.log(doc);
}).then(() => {
  mongoose.connection.close();
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.