引用错误不会从MongoDBcallback中抛出

介绍

所有的人都知道,如果我们调用undefined.test我们会收到以下错误(对于NodeJS和Javascript都是一样的):

 $ node > undefined.test TypeError: Cannot read property 'test' of undefined at repl:1:11 at REPLServer.self.eval (repl.js:110:21) at Interface.<anonymous> (repl.js:239:12) at Interface.EventEmitter.emit (events.js:95:17) at Interface._onLine (readline.js:202:10) at Interface._line (readline.js:531:8) at Interface._ttyWrite (readline.js:760:14) at ReadStream.onkeypress (readline.js:99:10) at ReadStream.EventEmitter.emit (events.js:98:17) at emitKey (readline.js:1095:12) 

这是正确的!

我怎么find这个问题?

过了一个星期,我花了大约30分钟的时间来debugging下面的问题:一个脚本意外停止,没有错误发生。

我有这个应该是一个对象的urlsvariables:

 var urls = settings.urls || {}; 

然后在接下来的urls行我需要得到一个string的urls shop密钥:

 var shop = urls.shop || "/"; 

我开始添加console.log来查找variables的值:

 console.log(urls); // undefined var shop = urls.shop || "/"; console.log("Passed"); // This isn't run. 

在我的脚本中的问题是,我正在重新定义一个新的 urlsvariables,使urls undefined ,但问题是:为什么不能读取未定义的属性“商店”没有出现在这里? 因为urls真的undefined

我们知道以下两种情况都在发生:NodeJS和Javascript:

  var a = 10; foo(function () { console.log(a); // undefined var a = 10; }); function foo(callback) { callback(); } 

这个问题

debugging问题后,我发现这个问题来自Mongo:如果我们调用undefined.something我们不会得到错误。

我创build了一个小脚本来演示这个:

 var mongo = require("mongodb"); // Mongo server var server = mongo.Server("127.0.0.1", 27017); var db = new mongo.Db("test", server, { safe: true }); console.log("> START"); // Open database console.log("Opening database."); db.open(function(err, db) { if (err) { return console.log("Cannot open database."); } // get collection console.log("No error. Opening collection."); db.collection("col_one", function(err, collection) { if(err) { return console.log(err) } // do something with the collection console.log("No error. Finding all items from collection."); collection.find().toArray(function(err, items) { if(err) { return console.log(err) } console.log("No error. Items: ", items); console.log("The following line is: undefined.shop." + "It will stop the process."); console.log(undefined.test); // THE ERROR DOES NOT APPEAR! console.log("> STOP"); // this message doesn't appear. }); }); }); 

我的问题是:

  1. 为什么错误不会出现? 这是什么原因? (一起debuggingMongoDB源代码以查找它将是一件好事。)
  2. 为什么调用undefined.something时进程停止?
  3. 这怎么能解决?

我创build了一个Github仓库 ,你可以下载我的小应用程序来演示这个问题。


有趣:

如果我们添加try {} catch (e) {}语句,我们会发现错误,并且进程继续显示STOP消息。

 try { console.log(undefined.test); } catch (e) { console.log(e); } 

日志:

 > START Opening database. No error. Opening collection. No error. Finding all items from collection. No error. Items: [] The following line is: undefined.shop. It will stop the process. [TypeError: Cannot read property 'test' of undefined] > STOP 

在github.com上查看 node-mongodb-native驱动程序问题,您会注意到该问题已在1.3.18版本中得到解决。 但是,我testing了它,并没有像预期的那样工作。