簡體   English   中英

MongoDB Node.js驅動程序:回調不處理插入時的異常

[英]MongoDB Node.js driver: callback does not handle exceptions on insert

w3school給出了一個將對象插入數據庫的簡單示例,但是在此示例中,回調似乎未捕獲某些異常,我無法理解原因。

在此修改示例中,

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/mydb";

MongoClient.connect(url, function(err, db) {
  if (err) throw err;
  // var myobj = { name: "Company Inc", address: "Highway 37" };
  var myobj;       // undefined
  db.collection("customers").insertOne(myobj, function(err, res) {
    if (err) console.log('Error: We should see this');
    console.log("1 document inserted");
    db.close();
  });
});

我試圖將一個未定義的對象插入到集合中,並希望回調通過打印出文本來處理異常(“錯誤:我們應該看到這個”)。

相反,將引發以下異常並終止程序(就像整個connect希望由try / catch塊包裝一樣)。

TypeError: Cannot read property '_id' of undefined

有人可以解釋為什么會這樣嗎?

謝謝!

在對MongoDb服務器運行實際的insertOne命令之前,將訪問您要插入的文檔的_id屬性,以查看當前是否為0 您可以在源代碼中看到這種情況。

這里的關鍵點是這是 insertOne請求的異步處理開始之前-在實際的插入過程中並未發生錯誤,而是在對doc參數進行預檢查期間發生了錯誤。 該代碼假定您未提供null / undefined文檔,在這種情況下,這不是正確的假設。

顯然,您可以在傳遞文檔之前對其進行檢查-確保它不是null / undefined這是明智的。 否則,您可以只將insertOne調用包裝在try / catch

MongoClient.connect(url, function(err, db) {
    if (err) throw err;
    // var myobj = { name: "Company Inc", address: "Highway 37" };
    var myobj;       // undefined

    try {
        db.collection("customers").insertOne(myobj, function(err, res) {
            if (err) console.log('Error: We should see this');
            console.log("1 document inserted");
            db.close();
        });
    } catch (e) {
        ...
    }
});

在將文檔發送到insertOne之前,我將采用檢查文檔是否有效的方法。 您對此完全有控制權,不需要try / catch

總而言之,您顯示的方法在某種程度上濫用了驅動程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM