यूपीडी:
इस पोस्ट के आधार पर, ऐसा लगता है कि उन्होंने फिक्स को तैनात कर दिया है जो वही करेगा जो हम यहां करते हैं। सुनिश्चित नहीं है कि यह पहले से ही npm (15.10.13) के भीतर है। https://github.com/mongodb/node -mongodb-native/issues/1092#ref-commit-2667d13
कुछ जांच के बाद मैं यह समझने में कामयाब रहा कि वहां क्या हो रहा है:
हर बार जब आप डेटाबेस से निपटने के लिए किसी भी विधि को कॉल करते हैं (ढूंढें, अपडेट करें, डालें, आदि) तो यह कर्सर बनाता है, जिसकी अपनी आईडी होती है और खुद को पंजीकृत करता है बाद में वापस बुलाए जाने के लिए डीबी के EventEmitter को। इस बीच यह स्वयं को उसी CallBackStore के भीतर _notReplyed ऑब्जेक्ट में पंजीकृत करता है।
लेकिन एक बार कनेक्शन बंद हो जाने के बाद, मैं कुछ भी नहीं ढूंढ सका जो _notReplied कर्सर के माध्यम से पुनरावृत्त हो और उन्हें त्रुटियों या टाइमर के साथ किसी भी तर्क के साथ ट्रिगर करेगा (यह अभी भी कहीं भी हो सकता है)। तो मैं चारों ओर छोटे काम लिखने में कामयाब रहा हूं, जो डीबी उत्सर्जित होने पर त्रुटि के साथ कर्सर को ट्रिगर करता है close घटना:
new mongodb.Db('testdb', new mongodb.Server('localhost', 27017, { }), { safe: true }).open(function (err, db) {
if (!err) {
db.on('close', function() {
if (this._callBackStore) {
for(var key in this._callBackStore._notReplied) {
this._callHandler(key, null, 'Connection Closed!');
}
}
});
// ...
} else {
console.log(err)
}
});
मैं MongoClient के बजाय पहले दृष्टिकोण का उपयोग करने की सलाह देता हूं। कारण कम हैं:उदाहरण के लिए जब आप कनेक्शन बंद करते हैं और फिर कॉल करते हैं .find यह कॉलबैक में त्रुटि को ठीक से ट्रिगर करेगा, जबकि MongoClient के साथ ऐसा नहीं होगा।
यदि आप MongoClient का उपयोग कर रहे हैं:
MongoClient.connect('mongodb://localhost:27017/testdb', function(err, db) {
if (!err) {
db.on('close', function() {
if (this._callBackStore) {
for(var key in this._callBackStore._notReplied) {
this._callHandler(key, null, 'Connection Closed!');
}
}
});
// ...
} else {
console.log(err);
}
});
यह क्या करेगा? एक बार कनेक्शन बंद हो जाने पर, यह सभी _notReplyed कर्सर के माध्यम से पुनरावृति करेगा और त्रुटि के साथ उनके लिए ईवेंट ट्रिगर करेगा Connection Closed! ।
टेस्ट केस:
items.find({ }).toArray(function(err, data) {
if (!err) {
console.log('Items found successfully');
} else {
console.log(err);
}
});
db.close();
यह करीबी डेटाबेस कनेक्शन को बाध्य करेगा और close trigger को ट्रिगर करेगा घटना जिसे आप पहले संभालते हैं और सुनिश्चित करेंगे कि कर्सर बंद हो जाएगा।
UPD:मैंने GitHub पर समस्या जोड़ी है:https://github.com /mongodb/node-mongodb-native/issues/1092 हम देखेंगे कि वे इस बारे में क्या कहते हैं।