तो टिप्पणी के रूप में, "यह एक बग है"। विशेष रूप से बग यहाँ हैए> :
// Return a Promise
return new this.s.promiseLibrary(function(resolve, reject) {
bulkWrite(self, operations, options, function(err, r) {
if(err && r == null) return reject(err);
resolve(r);
});
});
समस्या यह है कि "प्रतिक्रिया" (या r
) कॉलबैक में जिसे Promise
. में लपेटा जा रहा है वास्तव में null
नहीं है , और इसलिए त्रुटि मौजूद होने के बावजूद स्थिति true
. नहीं है और reject(err)
नहीं बुलाया जा रहा है, बल्कि resolve(r)
भेजा जा रहा है और इसलिए इसे अपवाद नहीं माना जाता है।
सुधार के लिए कुछ ट्राइएज की आवश्यकता होगी, लेकिन आप writeErrors
का निरीक्षण करके बताए गए अनुसार या तो 'काम कर सकते हैं' वर्तमान bulkWrite()
. से प्रतिक्रिया में संपत्ति कार्यान्वयन या अन्य विकल्पों में से एक पर विचार करें:
बल्क एपीआई विधियों का सीधे उपयोग करना:
const MongoClient = require('mongodb').MongoClient,
uri = 'mongodb://localhost:27017/myNewDb';
(async () => {
let db;
try {
db = await MongoClient.connect(uri);
let bulk = db.collection('myNewCollection').initializeOrderedBulkOp();
bulk.find({ foo: 'bar' }).upsert().updateOne({
$setOnInsert: { count: 0 },
$inc: { count: 0 }
});
let result = await bulk.execute();
console.log(JSON.stringify(result,undefined,2));
} catch(e) {
console.error(e);
} finally {
db.close();
}
})();
पूरी तरह से ठीक है लेकिन निश्चित रूप से इसके बजाय विरासत एपीआई विधियों का उपयोग करने के लिए बल्क एपीआई समर्थन के बिना सर्वर कार्यान्वयन पर स्वाभाविक रूप से वापस नहीं आने का मुद्दा है।
वादे को मैन्युअल रूप से लपेटना
(async () => {
let db = await require('mongodb').MongoClient.connect('mongodb://localhost:27017/myNewDb');
let mongoOps = [{
updateOne: {
filter: { foo: "bar" },
update: {
$setOnInsert: { count:0 },
$inc: { count:1 },
},
upsert: true,
}
}];
try {
let result = await new Promise((resolve,reject) => {
db.collection("myNewCollection").bulkWrite(mongoOps, (err,r) => {
if (err) reject(err);
resolve(r);
});
});
console.log(JSON.stringify(result,undefined,2));
console.log("Success!");
} catch(e) {
console.log("Failed:");
console.log(e);
}
})();
जैसा कि उल्लेख किया गया है कि समस्या bulkWrite()
. के कार्यान्वयन के भीतर निहित है एक Promise
के रूप में लौट रहा है . तो इसके बजाय आप callback()
. के साथ कोड कर सकते हैं फ़ॉर्म बनाएं और अपना Promise
करें आप जिस तरह से इसकी अपेक्षा करते हैं, उसके अनुसार कार्य करने के लिए लपेटना।
जैसा कि उल्लेख किया गया है, एक JIRA मुद्दे और ट्राइएज की आवश्यकता है जो अपवादों को संभालने का सही तरीका है। लेकिन उम्मीद है कि जल्द ही समाधान हो जाएगा। इस बीच, ऊपर से कोई तरीका चुनें।