Kom ihåg MongoClient.connect()
är asynkron. Databasanslutningen kanske inte är klar när du gör var user=db.collection('user');
. Databasanslutningen har gjorts när återuppringningen har gjorts, inte tidigare än så.
När den första begäran är klar, råkar databasanslutningen bara upprättas. Ju längre du väntar desto mer sannolikt är det att det fungerar, men det är fortfarande fel tillvägagångssätt.
Att arbeta med globala variabler är dålig praxis och leder till förvirring och andra problem .
Kortfattat ska koden se ut
// 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);
}
}
}
Använd det som
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
});
});
});
Observera att anslutningen görs på det första kravet, så om du lägger till require('database.js');
i App.js. Du förlorar inte på den första begäran.
Alternativt kan du använda löften , som tar hand om väntelogiken åt dig.