NodeJS:如果使用await,则无法访问try / catch中的函数参数

时间:2017-07-02 16:43:52

标签: node.js babeljs

我在nodejs 8(没有babel)上测试了这段代码。巴贝尔,两者都表现出相同的效果。

async function refreshBalance({ user }) {
  console.log(user) // show correct variable
  try {
    console.log(user) // throw error: variable not defined
    const user = await findObject('_User', user.id, {
      sessionToken: user.getSessionToken(),
    })

    return {
      balance: user.get('balance'),
      balanceUpdatedAt: user.get('updatedAt'),
    }
  }
  catch (error) {
    return formattedError(error)
  }
}

但如果我删除await,则不会抛出错误:

async function refreshBalance({ user }) {
  console.log(user) // show correct variable
  try {
    console.log(user) // show correct variable, no error

    return true
  }
  catch (error) {
    return formattedError(error)
  }
}

我知道我可以像这样缓存变量以使其工作:

async function refreshBalance({ user }) {
  const theUser = user
  try {
    console.log(theUser) // `theUser` variable is safe, `user` variable will throw error
    const user = await findObject('_User', theUser.id, {
      sessionToken: user.getSessionToken(),
    })

    return {
      balance: theUser.get('balance'),
      balanceUpdatedAt: theUser.get('updatedAt'),
    }
  }
  catch (error) {
    return formattedError(error)
  }
}

我很好奇为什么第一种方法显示错误?我已经搜索过google&没有找到任何答案。

修改

如果user是一个对象,则会抛出错误,如果user是字符串或数字,则不会抛出错误。

以下是我执行该功能的方法: refreshBalance({ user: { id: '123 '} })

1 个答案:

答案 0 :(得分:3)

将我的评论写成答案,因为它似乎适合你。

您对const user = ...的定义是"隐藏"或者"覆盖"同名的函数参数使得函数参数在定义const user的范围内无法访问。

最简单的解决方案是将这两个变量之一的名称更改为其他变量,以免它们发生冲突。