ऐसा इसलिए है क्योंकि कोड में एक एंटी-पैटर्न होता है:हर बार जब कोई नया अनुरोध आता है, तो यह एक नया डेटाबेस कनेक्शन खोलता है, फिर प्रतिक्रिया भेजे जाने के बाद उस कनेक्शन को बंद कर देता है। इसके बाद बाद में बंद कनेक्शन का पुन:उपयोग करने का प्रयास किया गया, इसलिए दूसरे अनुरोध पर आप जो त्रुटि संदेश देख रहे हैं।
आप जो चाहते हैं वह वैश्विक कनेक्शन ऑब्जेक्ट का उपयोग करके एप्लिकेशन के जीवनकाल के लिए केवल एक बार डेटाबेस से कनेक्ट करना है, फिर अपने डेटाबेस संचालन को करने के लिए उस वैश्विक ऑब्जेक्ट का उपयोग करें।
इस वैश्विक वस्तु का उपयोग करने से MongoDB ड्राइवर को डेटाबेस से कनेक्शन पूल ठीक से बनाने की अनुमति मिलती है। यह पूल MongoDB ड्राइवर द्वारा प्रबंधित किया जाता है, और महंगे कनेक्ट/रीकनेक्ट पैटर्न से बचा जाता है।
उदाहरण के लिए:
// listen on this port
const port = 3000
// global database client object
var client = null
// listen on the configured port once database connection is established
MongoClient.connect('mongodb://localhost:27017', { useNewUrlParser: true }, (err, res) => {
assert.equal(null, err)
client = res
app.listen(port, () => console.log(`Example app listening on port ${port}!`))
})
// use the client global object for database operations
app.get('/', (req, res) => {
db = req.query.db
col = req.query.col
client.db(db).collection(col).find({}).toArray((err, docs) => {
assert.equal(null, err)
res.send(JSON.stringify(docs))
})
})
संपादित करें कमेंट में अपने सवाल का जवाब देने के लिए:
ऐसा इसलिए है क्योंकि मूल कोड में, dbClient
विश्व स्तर पर परिभाषित किया गया था। जब dbClient.close()
कहा जाता था, वैश्विक dbClient
बंद था। तब एक त्रुटि उत्पन्न हुई जब वह dbClient
वस्तु का पुन:उपयोग किया गया। ऐसा इसलिए है क्योंकि connect()
एक कनेक्शन के बजाय एक कनेक्शन पूल बनाता है, और प्रति आमंत्रण कई बार कॉल किए जाने की उम्मीद नहीं थी।
यदि आप dbClient
वैश्विक दायरे से app.get()
. में परिवर्तनशील संदर्भ में, आप पाएंगे कि जब आप HTTP एंडपॉइंट को कई बार एक नए dbClient
के रूप में कॉल करते हैं, तो कोई त्रुटि उत्पन्न नहीं होगी। ऑब्जेक्ट हर बार बनाया गया था।
ऐसा कहकर, हालांकि यह काम करेगा, यह अनुशंसित पैटर्न नहीं है। मेरे द्वारा ऊपर पोस्ट किए गए उदाहरण कोड के समान पैटर्न का उपयोग करना बेहतर है।