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
请有人解释为什么会这样吗?
谢谢!
答案 0 :(得分:2)
在对MongoDb服务器运行实际的insertOne
命令之前,将访问您尝试插入的文档的_id
属性,以查看它当前是否为0
。您可以在source code。
这里的关键点是之前 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
。
总之,您展示的方法有点滥用驱动程序。