यहां समझने के लिए 3 प्रमुख बिंदु हैं और फिर मैं उन्हें विस्तार से समझाऊंगा।
- module.exports एक ऑब्जेक्ट है और ऑब्जेक्ट को JavaScript में कॉपी-ऑफ़-रेफ़रेंस द्वारा पास किया जाता है।
- आवश्यकता एक तुल्यकालिक है समारोह।
- client.connect एक एसिंक्रोनस है समारोह।
जैसा कि आपने सुझाव दिया है, यह एक समय की बात है। node.js यह नहीं जान सकता कि मॉड्यूल.एक्सपोर्ट बाद में बदलने वाला है। यह समस्या नहीं है। इसे कैसे पता चलेगा?
जब require
चलता है, यह एक फ़ाइल ढूंढता है जो आपके द्वारा दर्ज किए गए पथ के आधार पर इसकी आवश्यकताओं को पूरा करता है, इसे पढ़ता है और इसे निष्पादित करता है, और मॉड्यूल को कैश करता है। निर्यात करता है ताकि अन्य मॉड्यूल require
कर सकें एक ही मॉड्यूल और इसे फिर से शुरू करने की आवश्यकता नहीं है (जो चर स्कोपिंग आदि को गड़बड़ कर देगा)
client.connect एक एसिंक्रोनस फ़ंक्शन कॉल है, इसलिए इसे निष्पादित करने के बाद, मॉड्यूल निष्पादन समाप्त करता है और require
कॉल मॉड्यूल.एक्सपोर्ट संदर्भ की एक प्रति संग्रहीत करता है और उसे users.js को लौटाता है। फिर आप सेट करें module.exports = db
, पर अब बहुत देर हो गई है। आप मॉड्यूल.एक्सपोर्ट संदर्भ को डीबी के संदर्भ में बदल रहे हैं, लेकिन नोड में मॉड्यूल निर्यात require
कैशे पुराने ऑब्जेक्ट की ओर इशारा कर रहा है।
मॉड्यूल.एक्सपोर्ट्स को एक फ़ंक्शन के रूप में परिभाषित करना बेहतर है जो एक कनेक्शन प्राप्त करेगा और फिर इसे कॉलबैक फ़ंक्शन में पास करेगा:
var mongodb = require("mongodb");
var client = mongodb.MongoClient;
module.exports = function (callback) {
client.connect('mongodb://host:port/dbname', { auto_reconnect: true },
function(err, db) {
if (err) {
console.log(err);
callback(err);
} else {
// export db as member of exports
callback(err, db);
}
}
)
};
चेतावनी:हालांकि यह इस उत्तर के दायरे से बाहर है, यह सुनिश्चित करने के लिए उपरोक्त कोड से बहुत सावधान रहें कि आप कनेक्शन को उचित रूप से बंद/वापस कर दें, अन्यथा आप कनेक्शन लीक कर देंगे।