Запомнете MongoClient.connect()
е асинхронен. Връзката с базата данни може да не е готова по времето, когато правите var user=db.collection('user');
. Връзката с базата данни е направена след извършване на обратното извикване, не по-рано от това.
Когато първата заявка бъде направена, връзката с базата данни просто се установява. Колкото по-дълго чакате, толкова по-вероятно е това да работи, но все пак това е грешен подход.
Също така работата с глобални променливи е лоша практика и води до объркване и други проблеми .
Накратко кодът трябва да изглежда така
// 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);
}
}
}
След това го използвайте като
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
});
});
});
Обърнете внимание, че връзката се осъществява при първото изискване, така че ако добавите require('database.js');
в App.js. Не губите при първата заявка.
Като алтернатива можете да използвате promises , който се грижи за логиката на изчакване вместо вас.