首页 > 解决方案 > 要求函数在方法内的函数内不起作用

问题描述

我正在使用 Node.js 构建应用程序的后端,并且正在使用 postgresql 作为数据库。我在实现登录时遇到问题。更准确地说,我使用的是 bcrypt 模块,它在执行查询时调用的函数中不起作用。这是代码:

const login = async (request, response) => {
  const username = request.body.username

  console.log(request.body)

  pool.query('SELECT * FROM public."User" WHERE username = \'{' + username + '}\'', (error, results) => {
    if (error) {
      return response.status(400).send("Cannot find user: "+username)
    }
    try {
      if(await bcrypt.compare(request.body.password, results.rows[0].password.toString())) {
        response.send('Success')
      } else {
        response.send('Not allowed')
      }
    } catch {
      response.status(500).send("Server error")
    }
  })
}

问题是我执行了我的查询并且它可以工作,但是当它到达第二个 if 语句时,问题是这样的:

 if(await bcrypt.compare(request.body.password, results.rows[0].password.toString())) {
               ^^^^^^

SyntaxError: Unexpected identifier

我无法弄清楚如何解决它。

标签: node.jshttpserverbackendbcrypt

解决方案


我还尝试在 pool.query 函数之外使用 try/catch 语句,方法是将检索到的密码保存在变量中,如下所示:

const login = async (request, response) => {
  const username = request.body.username
  var hashedPassword

  console.log(request.body)

  pool.query('SELECT * FROM public."User" WHERE username = \'{' + username + '}\'', (error, results) => {
    if (error) {
      return response.status(400).send("Cannot find user: "+username)
    }
    hashedPassword = results.rows[0].password.toString()
  })

  try {
    if(await bcrypt.compare(request.body.password, hashedPassword)) {
      response.send('Success')
    } else {
      response.send('Not allowed')
    }
  } catch {
    response.status(500).send("Server error")
  }
}

但是通过这种方式,try/catch 语句在查询之前执行,实际上我什至不知道是否可以以这种方式设置变量“hashedPassword”,因为我总是发现它是“未定义的”


推荐阅读