尝试访问数组点时获取“无法读取属性0”

时间:2018-11-07 17:42:05

标签: javascript express

我正在尝试访问另一个函数中某个函数中设置的值,然后我想最后返回此值,我有一个console.log显示该值,而日志显示该值就很好,但是在尝试进行设置时,出现错误消息:TypeError: Cannot read property '0' of undefined

似乎当我尝试返回值(通过将函数设置为变量来执行此操作)时,显示没有结果的功能。不知道如何通过setValue函数显示结果,有什么想法吗? :)我的快递代码:

function showBalance(cardNumber) {
  connection.query(
    "SELECT Balance from userCards WHERE CardNumber  = '" + cardNumber + "'",
    function(err, rows) {
      if (err) {
        throw err;
      } else {
        setValue(rows);
      }
    }
  );
  function setValue(value) {
    console.log('Balance object is:', value[0].Balance);
    const ownBalance = value[0].Balance;
    console.log('The user balance is: ', ownBalance);
    return ownBalance;
  }
  const returnBalance = setValue();
  return returnBalance;
}
module.exports = showBalance;

1 个答案:

答案 0 :(得分:0)

const returnBalance = setValue()行中,调用带有0个参数的setValue。这将导致脚本失败,因为在未定义值的情况下无法执行value[0]

您不能使外部函数返回来自匿名内部回调的值。这是因为外部函数在调用回调之前返回。您需要执行以下操作之一:

  • 将函数作为参数传递给您的外部函数,该函数表示回调触发后应发生的情况。您从回调中调用此函数并将值传递给它。这称为延续传递样式。

  • 使用支持Promises的API,并让您的外部函数返回一个Promise,其中包含值而不是值本身。您可以使用承诺https://nodejs.org/dist/latest-v8.x/docs/api/util.html#util_util_promisify_original

  • 使基于回调的API适应承诺。
  • 使用async / await以与同步代码非常相似的方式编写异步代码。这在后台也使用Promises,因此需要兼容的API或如上所述的Promisify。