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();
});
});
我正在尝试将一个 undefined object 插入到集合中,并希望回调通过打印出文本(“错误:我们应该看到这个”)来处理异常。
相反,会抛出以下异常并终止程序(就好像整个 connect
都希望被 try/catch block 包装)。
TypeError: Cannot read property '_id' of undefined
有人能解释一下为什么会这样吗?
谢谢!
最佳答案
在对 MongoDb 服务器运行实际的 insertOne
命令之前,访问您尝试插入的文档的 _id
属性以查看它当前是否为 0
。您可以在 source code 中看到这种情况发生.
这里的关键点是,这是 before 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
。
总而言之,您展示的方法在某种程度上是对驱动程序的滥用。
关于javascript - MongoDB Node.js 驱动程序 : callback does not handle exceptions on insert,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46529875/