MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Trình điều khiển gốc MongoDB Node.js âm thầm nuốt ngoại lệ `BulWrite`

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à truereject(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.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB đối lập với $ addToSet

  2. Làm cách nào để sử dụng MongoDB với Flask?

  3. Mẹo quản lý sao lưu MongoDB cho các cụm bị chia nhỏ

  4. Các phương pháp tiếp cận MongoDB để lưu trữ một lượng lớn dữ liệu số liệu / phân tích

  5. Viết các bài kiểm tra cho các API RESTful của Python Eve so với MongoDB thực