Il modo migliore per inserire il database in Mongoose dipende dalla versione di Mongoose che stai utilizzando. Se stai utilizzando una versione di Mongoose 4.6.4 o successiva, è probabile che questo metodo aggiunto in quella versione funzionerà bene per te:
mongoose.connection.dropDatabase();
Nelle versioni precedenti questo metodo non esisteva. Invece, dovevi usare una chiamata MongoDB diretta:
mongoose.connection.db.dropDatabase();
Tuttavia, se questo è stato eseguito subito dopo la creazione della connessione al database, potrebbe non riuscire silenziosamente. Ciò è correlato alla connessione effettivamente asincrona e non ancora configurata quando viene eseguito il comando. Questo normalmente non è un problema per altre chiamate Mongoose come.find()
, che si accodano fino a quando la connessione non è aperta e quindi vengono eseguite.
Se guardi il codice sorgente di dropDatabase()
collegamento che è stato aggiunto, puoi vedere che è stato progettato per risolvere esattamente questo problema. Verifica se la connessione è aperta e pronta. In tal caso, attiva immediatamente il comando. In caso contrario, registra il comando da eseguire quando la connessione al database è stata aperta.
Alcuni dei suggerimenti precedenti consigliano di inserire sempre il dropDatabase
comando nel open
gestore. Ma ciò funziona solo nel caso in cui la connessione non sia ancora aperta.
Connection.prototype.dropDatabase = function(callback) {
var Promise = PromiseProvider.get();
var _this = this;
var promise = new Promise.ES6(function(resolve, reject) {
if (_this.readyState !== STATES.connected) {
_this.on('open', function() {
_this.db.dropDatabase(function(error) {
if (error) {
reject(error);
} else {
resolve();
}
});
});
} else {
_this.db.dropDatabase(function(error) {
if (error) {
reject(error);
} else {
resolve();
}
});
}
});
if (callback) {
promise.then(function() { callback(); }, callback);
}
return promise;
};
Ecco una versione semplice della logica precedente che può essere utilizzata con le versioni precedenti di Mongoose:
// This shim is backported from Mongoose 4.6.4 to reliably drop a database
// http://stackoverflow.com/a/42860208/254318
// The first arg should be "mongoose.connection"
function dropDatabase (connection, callback) {
// readyState 1 === 'connected'
if (connection.readyState !== 1) {
connection.on('open', function() {
connection.db.dropDatabase(callback);
});
} else {
connection.db.dropDatabase(callback);
}
}