Zapamiętaj MongoClient.connect()
jest asynchroniczna. Połączenie z bazą danych może nie być gotowe w momencie wykonywania var user=db.collection('user');
. Połączenie z bazą danych zostało nawiązane zaraz po wykonaniu wywołania zwrotnego, nie wcześniej.
Po wykonaniu pierwszego żądania połączenie z bazą danych zostaje nawiązane. Im dłużej czekasz, tym większe prawdopodobieństwo, że to działa, ale nadal jest to złe podejście.
Również praca ze zmiennymi globalnymi jest złą praktyką i prowadzi do zamieszania i inne problemy .
W skrócie kod powinien wyglądać tak
// 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);
}
}
}
Niż używaj go jak
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
});
});
});
Zauważ, że połączenie jest nawiązywane na pierwszym wymaganiu, więc jeśli dodasz require('database.js');
w App.js. Nie tracisz przy pierwszej prośbie.
Alternatywnie możesz użyć obietnice , który zajmuje się logiką oczekiwania za Ciebie.