在js类的异步函数内调用函数

时间:2019-02-23 12:57:23

标签: javascript node.js express mongoose async-await

嗨,我是javascript编程的新手。

我有一个节点快速项目,我正在尝试在AuthenticationController类中创建一个登录方法。

我的登录方法现在是这样的:

const User = require('../models/User')

class AuthenticationController {

  async login(req, res) {
    const { email, password } = req.body
    console.log('step 1')
    var hashPassword = await userPassword(email)
    console.log(hashPassword)
    console.log('step 2')
    return res.status(200).json({ 'msg': 'Log in OK!' })

  }

  userPassword(email) {
    User.findOne({ email: email }).exec(function(err, user) {
      if (err) return err
      else return user.password
    })
  }
}

但是我收到一条错误消息,说userPassword是未定义的,我不知道为什么。所以我的疑问是:为什么会这样,以及如何正确进行?

我也检查了这个问题,但是他们没有帮助我

控制台上的错误消息:

(节点:28968)UnhandledPromiseRejectionWarning:ReferenceError:未定义userPassword ...

(节点:28968)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。引发此错误的原因可能是抛出了一个没有catch块的异步函数,或者是拒绝了一个.catch()无法处理的承诺。 (拒绝ID:1)

(节点:28968)[DEP0018] DeprecationWarning:已弃用未处理的承诺拒绝。将来,未处理的承诺拒绝将以非零退出代码终止Node.js进程。

2 个答案:

答案 0 :(得分:2)

login不是指userPassword方法,而是指不存在的同名函数。

应该将承诺链接在一起,而不会。 userPassword有望返回承诺,但它使用了过时的Mongoose回调API。

显示UnhandledPromiseRejectionWarning意味着login中的错误没有得到正确处理。如this answer中所述,Express不支持诺言,因此开发人员应处理错误。

应该是:

  async login(req, res) {
      try {
        const { email, password } = req.body
        var hashPassword = await this.userPassword(email)
        return res.status(200).json({ 'msg': 'Log in OK!' })
      } catch (err) {
        // handle error
      }
  }

  async userPassword(email) {
    const { password } = await User.findOne({ email: email });
    return password;
  }

答案 1 :(得分:0)

此错误即将到来,因为您没有为诺言处理错误。始终在try / catch块中使用async / await。

try{
  async login(req, res) {
    const { email, password } = req.body
    console.log('step 1')
    var hashPassword = await userPassword(email)
    console.log(hashPassword)
    console.log('step 2')
    return res.status(200).json({ 'msg': 'Log in OK!' })
  }
}catch(e){
    console.log(e)
}