Husk MongoClient.connect()
er asynkron. Databaseforbindelsen er muligvis ikke klar på det tidspunkt, du gør var user=db.collection('user');
. Databaseforbindelsen er blevet oprettet efter tilbagekaldet, ikke tidligere end det.
Når den første anmodning er udført, er databaseforbindelsen tilfældigvis oprettet. Jo længere du venter, jo mere sandsynligt er det, at det virker, men det er stadig den forkerte tilgang.
At arbejde med globale variabler er også dårlig praksis og fører til forvirring og andre problemer .
Kort sagt skal koden se ud
// 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);
}
}
}
Brug 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
});
});
});
Bemærk, at forbindelsen er lavet på det første krav, så hvis du tilføjer require('database.js');
i App.js. Du mister ikke ved den første anmodning.
Alternativt kan du bruge løfter , som tager sig af ventelogikken for dig.