javascript - MongoDB Node.js 驱动程序 : callback does not handle exceptions on insert

标签 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();
  });
});

我正在尝试将一个 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/

相关文章:

mongodb - 如何使用 MongoDb $gte 和 $lte 将日期和时间保存为单独字段上的字符串

javascript - WinJS 从 LocalState 文件夹中删除文件夹

javascript - 将响应显示为 XPages 父文档上的嵌入 View

node.js - 通过公共(public)Apache服务器访问服务器局域网中的node.js、mongo DB

javascript - 如何在 JavaScript 中从 char 获取 make 代码?

javascript - 基于文本的表 Node.js 的对象数组

python - 如何从 pymongo 发出 "show dbs"

javascript - 为什么我的输出未定义

javascript - 为什么主干过滤器收集在传递给 View 时失败

node.js - Nodejs Winston DailyRotateFile 自定义格式化程序