Ingat MongoClient.connect()
adalah asinkron. Koneksi database mungkin tidak siap pada saat Anda melakukan var user=db.collection('user');
. Koneksi database telah dibuat setelah panggilan balik selesai, tidak lebih awal dari itu.
Ketika permintaan pertama selesai, koneksi database kebetulan dibuat. Semakin lama Anda menunggu, semakin besar kemungkinan itu berhasil, tetapi tetap saja itu pendekatan yang salah.
Juga bekerja dengan variabel global adalah praktik yang buruk dan menyebabkan kebingungan dan masalah lain .
Singkatnya kode akan terlihat seperti
// module database.js
var mongodb= require('mongodb');
var MongoClient= mongodb.MongoClient;
var URL = 'mongodb://127.0.0.1:27017/mainDB';
var db;
var error;
var waiting = []; // Callbacks waiting for the connection to be made
MongoClient.connect(URL,function(err,database){
error = err;
db = database;
waiting.forEach(function(callback) {
callback(err, database);
});
});
module.exports = function(callback) {
if (db || error) {
callback(error, db);
} else {
waiting.push(callback);
}
}
}
Daripada menggunakannya seperti
var db = require('database.js');
router.post('/',function(req,res,next){
username=req.body.username;
password=req.body.password;
db.conn(function(err, database) {
if (err) {
res.sendStatus(500);
console.log(err);
return;
}
database.collection('users').findOne({'username':username, 'password':password}, function(err, docs){
//do something
});
});
});
Perhatikan bahwa koneksi dibuat pada kebutuhan pertama, jadi jika Anda menambahkan require('database.js');
di App.js. Anda tidak kehilangan permintaan pertama.
Atau Anda dapat menggunakan janji , yang menangani logika menunggu untuk Anda.