Ada 3 poin kunci yang harus dipahami di sini dan kemudian saya akan menjelaskannya secara detail.
- module.exports adalah sebuah objek dan objek-objek dilewatkan oleh salinan referensi dalam JavaScript.
- memerlukan adalah sinkron fungsi.
- client.connect adalah asinkron fungsi.
Seperti yang Anda sarankan, ini adalah masalah waktu. node.js tidak dapat mengetahui bahwa module.exports akan berubah nanti. Bukan itu masalahnya. Bagaimana ia tahu itu?
Ketika require
berjalan, ia menemukan file yang memenuhi persyaratannya berdasarkan jalur yang Anda masukkan, membacanya dan menjalankannya, dan menyimpan modul. ekspor sehingga modul lain dapat require
modul yang sama dan tidak perlu menginisialisasi ulang (yang akan mengacaukan pelingkupan variabel, dll.)
client.connect adalah panggilan fungsi asinkron, jadi setelah Anda menjalankannya, modul menyelesaikan eksekusi dan require
call menyimpan salinan referensi module.exports dan mengembalikannya ke users.js. Kemudian Anda mengatur module.exports = db
, tapi sudah terlambat. Anda mengganti referensi module.exports dengan referensi ke db, tetapi ekspor modul di node require
cache menunjuk ke objek lama.
Lebih baik mendefinisikan module.exports sebagai fungsi yang akan mendapatkan koneksi dan kemudian meneruskannya ke fungsi panggilan balik seperti:
var mongodb = require("mongodb");
var client = mongodb.MongoClient;
module.exports = function (callback) {
client.connect('mongodb://host:port/dbname', { auto_reconnect: true },
function(err, db) {
if (err) {
console.log(err);
callback(err);
} else {
// export db as member of exports
callback(err, db);
}
}
)
};
Peringatan:meskipun di luar cakupan jawaban ini, berhati-hatilah dengan kode di atas untuk memastikan Anda menutup/mengembalikan koneksi dengan benar, jika tidak, Anda akan membocorkan koneksi.