最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

无法读取的未定义的属性

IT培训 admin 3浏览 0评论

无法读取的未定义的属性

我编码节点JS服务器端应用程序,我在MySQL中使用数据库。

我得到“类型错误:无法读取属性未定义的‘激活’”

我的要求去做应该说是“空集”当我在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");
    }
}

我应该得到:

该请求发送一个空集,所以关键不存在。

谢谢您的帮助!

回答如下:

错误

该错误是告诉你,你正在使用一个变量是不确定的。它会告诉你是因为你试图从一个未定义的变量读取性能。

你提到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不存在的可能性。含义activatedundefined

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
  }
})

异步回调

要解决!activated在第二if语句总是被true,你应该看看回调是如何工作的。基本上DB.query熄灭并做它的事情。当它完成,它将执行你提供它作为一个回调函数。执行的顺序看起来是这样的:

  1. 呼叫DB.query一个请求发送到数据库
  2. 继续脚本的执行。即检查if (!activated) { ...
  3. 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问题的更多信息。

无法读取的未定义的属性

我编码节点JS服务器端应用程序,我在MySQL中使用数据库。

我得到“类型错误:无法读取属性未定义的‘激活’”

我的要求去做应该说是“空集”当我在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");
    }
}

我应该得到:

该请求发送一个空集,所以关键不存在。

谢谢您的帮助!

回答如下:

错误

该错误是告诉你,你正在使用一个变量是不确定的。它会告诉你是因为你试图从一个未定义的变量读取性能。

你提到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不存在的可能性。含义activatedundefined

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
  }
})

异步回调

要解决!activated在第二if语句总是被true,你应该看看回调是如何工作的。基本上DB.query熄灭并做它的事情。当它完成,它将执行你提供它作为一个回调函数。执行的顺序看起来是这样的:

  1. 呼叫DB.query一个请求发送到数据库
  2. 继续脚本的执行。即检查if (!activated) { ...
  3. 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问题的更多信息。

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论