MongoDB的Node.js驱动程序:callback不插入时处理exception

w3school提供了一个将对象插入数据库的简单示例,但是在这个例子中,callback似乎没有捕捉到一些exception,我不明白为什么。

在这个修改的例子中,

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

我试图插入一个未定义的对象到一个集合,并希望通过打印出来的文本('错误:我们应该看到这个')callback来处理exception。

相反,下面的exception被抛出,程序终止(就像整个connect期望被try / catch块封装一样)。

 TypeError: Cannot read property '_id' of undefined 

请有人解释为什么会发生这种情况?

谢谢!

在针对MongoDb服务器运行实际的insertOne命令之前,要访问正在尝试插入的文档的_id属性,以查看它是否当前为0 。 你可以看到这发生在源代码中 。

这里的关键是,这是 insertOne请求的asynchronous处理开始之前 – 在实际插入过程中,而不是在doc参数的预检查期间,错误没有发生。 代码假定你没有提供一个null / undefined文件,在这种情况下,这是不正确的假设。

很明显,你可以在传入文档之前检查文档 – 确保它不是null / undefined – 这是明智的。 否则,你可以insertOne一个try / catchinsertOne调用:

 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

总而言之,您所展示的方法有些是对驾驶员的滥用。