コメントしたように、「それはバグです」。具体的には、バグはここにあります :
// 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()
からの応答のプロパティ 実装するか、他の選択肢の1つを次のように検討します。
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();
}
})();
完全に問題ありませんが、もちろん、バルク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()
の実装にあります。 Promise
として返されます 。したがって、代わりにcallback()
を使用してコーディングできます。 独自のPromise
を作成して実行します 期待どおりに動作するためのラッピング。
繰り返しになりますが、例外を処理する正しい方法であるJIRAの問題とトリアージが必要です。しかし、うまくいけば、すぐに解決されます。それまでの間、上からアプローチを選択してください。