La meilleure façon de déposer votre base de données dans Mongoose dépend de la version de Mongoose que vous utilisez. Si vous utilisez une version de Mongoose que 4.6.4 ou plus récente, alors cette méthode ajoutée dans cette version fonctionnera probablement bien pour vous:
mongoose.connection.dropDatabase();
Dans les versions plus anciennes, cette méthode n'existait pas. Au lieu de cela, vous deviez utiliser un appel MongoDB direct:
mongoose.connection.db.dropDatabase();
Cependant, si cela était exécuté juste après la création de la connexion à la base de données, il pourrait éventuellement échouer silencieusement. Ceci est lié au fait que la connexion est réellement asynchrone et n'est pas encore configurée lorsque la commande se produit. Ce n'est normalement pas un problème pour les autres appels Mongoose comme .find()
, quelle file d'attente jusqu'à ce que la connexion soit ouverte, puis exécutée.
Si vous regardez le code source du dropDatabase()
raccourci qui a été ajouté, vous pouvez voir qu'il a été conçu pour résoudre exactement ce problème. Il vérifie si la connexion est ouverte et prête. Si tel est le cas, il déclenche la commande immédiatement. Sinon, il enregistre la commande à exécuter lorsque la connexion à la base de données est ouverte.
Certaines des suggestions ci-dessus recommandent de toujours placer votre dropDatabase
commande dans le open
gestionnaire. Mais cela ne fonctionne que dans le cas où la connexion n'est pas encore ouverte.
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;
};
Voici une version simple de la logique ci-dessus qui peut être utilisée avec les versions antérieures de 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);
}
}