[英]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.