因此评论说,“这是一个错误”。具体来说,错误就在这里:
// 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包装在a中的回调中的“响应”(或)
Promise实际上不是
null,因此尽管存在错误,也不会
true并
reject(err)不会调用该条件,而是
resolve(r)正在发送并因此这不视为例外。
更正需要一些分类,但是您可以通过检查
writeErrors当前
bulkWrite()实现的响应中的属性来“解决”,也可以考虑以下其他替代方法之一:直接使用Bulk API方法:
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(); }})();
完全没问题,但是当然存在这样的问题:在没有Bulk API支持的情况下,无法在服务器实现上自然退步,而是改用传统API方法。
手动包装承诺(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()以a形式返回
Promise。因此,您可以使用该
callback()表单进行编码并自行
Promise包装,以按照您的期望进行 *** 作。
再次指出,需要JIRA问题和Triage,这是处理异常的正确方法。但希望很快能解决。同时,从上方选择一种方法。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)