Cara terbaik untuk meletakkan database Anda di Mongoose bergantung pada versi Mongoose yang Anda gunakan. Jika Anda menggunakan versi Mongoose 4.6.4 atau yang lebih baru, maka metode yang ditambahkan dalam rilis tersebut kemungkinan akan berfungsi dengan baik untuk Anda:
mongoose.connection.dropDatabase();
Dalam rilis yang lebih lama, metode ini tidak ada. Sebagai gantinya, Anda akan menggunakan panggilan MongoDB langsung:
mongoose.connection.db.dropDatabase();
Namun, jika ini dijalankan tepat setelah koneksi database dibuat, itu mungkin bisa gagal secara diam-diam. Ini terkait dengan koneksi yang sebenarnya asynchronous dan belum diatur ketika perintah terjadi. Ini biasanya tidak menjadi masalah untuk panggilan Mongoose lainnya seperti.find()
, yang mengantri sampai koneksi terbuka dan kemudian dijalankan.
Jika Anda melihat kode sumber untuk dropDatabase()
pintasan yang ditambahkan, Anda dapat melihat bahwa itu dirancang untuk menyelesaikan masalah ini dengan tepat. Ia memeriksa untuk melihat apakah koneksi terbuka dan siap. Jika demikian, itu akan segera mengaktifkan perintah. Jika tidak, ini mendaftarkan perintah untuk dijalankan ketika koneksi database telah dibuka.
Beberapa saran di atas merekomendasikan untuk selalu meletakkan dropDatabase
perintah Anda di open
handler. Tapi itu hanya berfungsi jika koneksi belum terbuka.
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;
};
Berikut adalah versi sederhana dari logika di atas yang dapat digunakan dengan versi Mongoose sebelumnya:
// 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);
}
}