याद रखें 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');
जोड़ते हैं ऐप.जे.एस. में आप पहले अनुरोध पर नहीं खोते हैं।
वैकल्पिक रूप से आप वादे का उपयोग कर सकते हैं , जो आपके लिए वेटिंग लॉजिक का ख्याल रखता है।