所有人都知道,如果我们拨打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
我的问题是:
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.
});
});
});
?我创建了一个Github repository,您可以在其中下载我的小应用程序来演示此问题。
有趣:
如果我们添加undefined.something
语句,我们会发现错误,并且流程会继续显示try {} catch (e) {}
消息。
STOP
日志:
try {
console.log(undefined.test);
} catch (e) {
console.log(e);
}
答案 0 :(得分:2)
在node-mongodb-native
驱动程序问题上查看github.com,您会发现该问题已在1.3.18
版本中得到解决。但是,我测试了它并且没有按预期工作。