MongoDB回调不会抛出引用错误

时间:2013-08-11 06:09:28

标签: javascript node.js mongodb

简介

所有人都知道,如果我们拨打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)

这是对的!

我是如何找到问题的?

通过一周我在调试以下问题时浪费了大约30分钟:脚本意外停止并且没有抛出任何错误。

我有一个应该是对象的urls变量:

var urls = settings.urls || {}; 

然后在接下来的行中,我需要获得shop的{​​{1}}密钥作为字符串:

urls

我开始添加var shop = urls.shop || "/"; 来查找变量的值:

console.log

我的脚本中的问题是我正在重新定义console.log(urls); // undefined var shop = urls.shop || "/"; console.log("Passed"); // This isn't run. urls urls变量,但问题是:为什么< strong> 无法读取属性“商店”未定义 没有出现在这里?因为undefined确实是urls

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

undefined

问题

在调试问题之后我发现这个问题来自Mongo:如果我们调用 var a = 10; foo(function () { console.log(a); // undefined var a = 10; }); function foo(callback) { callback(); } ,我们不要得到错误。在Mongo回调内部。

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

undefined.something

我的问题是:

  1. 为什么不出现错误?这是什么原因? (将MongoDB源代码一起调试以找到它会很棒。)
  2. 为什么在调用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. }); }); });
  3. 时停止了该过程
  4. 怎么能解决这个问题?
  5. 我创建了一个Github repository,您可以在其中下载我的小应用程序来演示此问题。


    有趣:

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

    STOP

    日志:

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

1 个答案:

答案 0 :(得分:2)

node-mongodb-native驱动程序问题上查看github.com,您会发现该问题已在1.3.18版本中得到解决。但是,我测试了它并且没有按预期工作。