Vì vậy, như đã nhận xét, "Đó là một lỗi". Cụ thể, lỗi là ngay tại đây :
// 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);
});
});
Vấn đề là "phản hồi" (hoặc r
) trong lệnh gọi lại đang được bao bọc trong một Promise
không thực sự là null
, và do đó, mặc dù có lỗi nhưng điều kiện không phải là true
và reject(err)
không được gọi, mà là resolve(r)
đang được gửi và do đó đây không được coi là một ngoại lệ.
Việc sửa lỗi sẽ cần một số phân đoạn, nhưng bạn có thể 'khắc phục' như đã đề cập bằng cách kiểm tra writeErrors
trong phản hồi từ bulkWrite()
hiện tại thực hiện hoặc xem xét một trong các lựa chọn thay thế khác như:
Sử dụng trực tiếp các phương thức 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();
}
})();
Hoàn toàn tốt nhưng tất nhiên có vấn đề là không tự nhiên thoái lui khi triển khai máy chủ mà không có hỗ trợ Bulk API để sử dụng các phương thức API cũ thay thế.
Kết thúc lời hứa một cách thủ công
(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);
}
})();
Như đã lưu ý, vấn đề nằm trong việc triển khai how bulkWrite()
đang trở lại dưới dạng Promise
. Vì vậy, thay vào đó, bạn có thể viết mã bằng callback()
hình thành và thực hiện Promise
của riêng bạn để hoạt động theo cách bạn mong đợi.
Một lần nữa, như đã lưu ý, cần có vấn đề về JIRA và Triage là cách chính xác để xử lý các trường hợp ngoại lệ. Nhưng hy vọng sẽ sớm được giải quyết. Trong thời gian chờ đợi, hãy chọn một cách tiếp cận từ phía trên.