我正在使用节点JS编写服务器端应用程序,并且正在使用MySQL中的数据库。
我收到“ TypeError:无法读取未定义的属性“已激活””
当我在MySQL终端中手动执行该请求时,我应该说“空集”。
当我尝试在我输入的代码中使用无效的discord_key时,它返回一个错误,但是我希望它仅返回错误警报,以便我可以捕获并使用该信息。
function checkKey(key) {
var activated = "";
var sqlcheck = "SELECT activated from authentification where discord_ key = ?";
console.log("in function");
DB.query(sqlcheck, [key], function (err, result) {
if (err) throw (err);
activated = result[0].activated;
});
if (!activated) {
console.log("null");
return ("NULL");
} else {
console.log("used");
return ("used");
}
}
我应该得到:
该请求发送了一个空集,因此密钥不存在。
感谢您的帮助!
答案 0 :(得分:2)
万一没有结果,您可以这样写:
if (err) throw (err);
activated = result.length ? result[0].activated : false;
如果没有结果,它将返回false。
答案 1 :(得分:1)
错误
错误告诉您正在使用的变量未定义。它告诉您这是因为您尝试从未定义的变量读取属性。
您提到result
是一个空数组。这意味着您尝试访问的任何索引都将返回undefined
。例如:
let result = []
console.log(result[0] === undefined) // prints true
在javascript中,如果您尝试访问undefined
的属性,则会收到错误消息。继续我们的示例:
result[0].activated // Throws error: Cannot read property 'activated' of undefined.
由于没有保证result[0]
具有值,因此在访问其属性之前,应确保它不是undefined
。如@NipunChawla所示,一种方法是检查数组的长度(即至少一个值):
if (result.length) { // Does result have values?
activated = result[0].activated
} else {
activated = false
}
更好的是,如果您知道自己仅在使用result[0]
,请检查它是否直接定义:
if (result[0]) { // Does result[0] have a value?
activated = result[0].activated
} else {
activated = false
}
您仍然有可能不存在result[0].activated
。意思是activated
将是undefined
。
if (result[0] && result[0].activated) { // ... and does the first value
// contain the property activated?
activated = result[0].activated
} else {
activated = false
}
所以现在在一起:
DB.query(sqlcheck, [key], function (err, result) {
if (err) throw (err);
if (result[0] && result[0].activated) {
activated = result[0].activated
} else {
activated = false
}
})
异步回调
要在第二条if语句始终为!activated
中修复true
,则应研究回调的工作方式。基本上DB.query
会开始工作。完成后,它将执行您作为回调提供的功能。执行顺序如下所示:
DB.query
将请求发送到您的数据库if (!activated) { ...
DB.query
现在已完成并调用您的回调,并分配了activated = result[0].activated
。即function(err, result)
一种快速解决此问题的方法如下:
function checkKey(key) {
var activated = "";
var sqlcheck = "SELECT activated from authentification where discord_ key = ?";
console.log("in function");
DB.query(sqlcheck, [key], function (err, result) {
if (err) throw (err);
if (result[0] && result[0].activated) {
activated = result[0].activated
} else {
activated = false
}
doSomethingWithResult(activated)
});
}
function doStuffWithResult(activated) {
if (!activated) {
console.log("null");
// Do your !activated stuff
} else {
console.log("used");
// Do your activated stuff
}
}
有关更多信息,请参见this问题。