Onthoud MongoClient.connect()
is asynchroon. De databaseverbinding is mogelijk niet gereed op het moment dat u dit doet var user=db.collection('user');
. De databaseverbinding is gemaakt zodra de callback is voltooid, niet eerder dan dat.
Wanneer het eerste verzoek is gedaan, wordt de databaseverbinding toevallig tot stand gebracht. Hoe langer je wacht, hoe groter de kans dat het werkt, maar toch is het de verkeerde aanpak.
Ook werken met globale variabelen is een slechte gewoonte en leidt tot verwarring en andere problemen .
In het kort zou de code eruit moeten zien
// 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);
}
}
}
Gebruik het dan als
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
});
});
});
Merk op dat de verbinding tot stand wordt gebracht op de eerste vereiste, dus als u require('database.js');
toevoegt in App.js. Je verliest de op het eerste verzoek niet.
Als alternatief kunt u beloften gebruiken , die de wachtlogica voor u regelt.