MongoDB Node.js驱动程序:回调不处理插入时的异常

时间:2017-10-02 16:39:18

标签: javascript node.js mongodb

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

请有人解释为什么会这样吗?

谢谢!

1 个答案:

答案 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

总之,您展示的方法有点滥用驱动程序。