Hãy nhớ MongoClient.connect()
là không đồng bộ. Kết nối cơ sở dữ liệu có thể chưa sẵn sàng tại thời điểm bạn thực hiện var user=db.collection('user');
. Kết nối cơ sở dữ liệu đã được thực hiện khi cuộc gọi lại được thực hiện, không sớm hơn thế.
Khi yêu cầu đầu tiên được thực hiện, kết nối cơ sở dữ liệu chỉ tình cờ được thiết lập. Bạn đợi càng lâu thì khả năng nó hoạt động càng cao, nhưng đó vẫn là cách tiếp cận sai.
Ngoài ra, làm việc với các biến toàn cục là một phương pháp không tốt và dẫn đến nhầm lẫn và các vấn đề khác .
Trong ngắn hạn, mã sẽ giống như
// 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);
}
}
}
Hơn sử dụng nó như
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
});
});
});
Lưu ý rằng kết nối được thực hiện theo yêu cầu đầu tiên, vì vậy nếu bạn thêm require('database.js');
trong App.js. Bạn không bị mất yêu cầu đầu tiên.
Ngoài ra, bạn có thể sử dụng lời hứa , xử lý logic chờ đợi cho bạn.