介绍
所有人都知道,如果我们调用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
的键urls
:
var shop = urls.shop || "/";
我开始添加console.log
以查找变量的值:
console.log(urls); // undefined
var shop = urls.shop || "/";
console.log("Passed"); // This isn't run.
我的脚本中的问题是我正在重新定义一个正在生成的新 urls
变量urls
undefined
,但问题是:为什么无法读取未定义的属性“商店”没有出现在这里?因为urls
真的undefined
。
我们知道以下两种情况都在发生:NodeJS 和 Javascript:
var a = 10;
foo(function () {
console.log(a); // undefined
var a = 10;
});
function foo(callback) { callback(); }
问题
调试问题后,我发现这个问题来自 Mongo:在 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.
});
});
});
我的问题是:
- 为什么错误没有出现?这是什么原因?(最好一起调试 MongoDB 源代码来找到它。)
- 为什么调用时进程停止
undefined.something
? - 这怎么能解决?
我创建了一个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