Вызов функции внутри асинхронной функции в классе js - PullRequest
0 голосов
/ 23 февраля 2019

Привет, я новичок в программировании на 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 ().(идентификатор отклонения: 1)

(узел: 28968) [DEP0018] Предупреждение об устаревании: отклонение необработанного обещания не рекомендуется.В будущем отклонения обещаний, которые не обрабатываются, завершат процесс Node.js с ненулевым кодом завершения.

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

эта ошибка появляется, потому что вы не обрабатываете ошибку для обещания.Всегда используйте async / await внутри блока try / catch.

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)
}
0 голосов
/ 23 февраля 2019

login относится не к методу userPassword, а к функции с тем же именем, которая не существует.

Предполагается, что обещания связаны, а их нет.Ожидается, что userPassword вернет обещание, но использует устаревший API обратного вызова Mongoose.

Отображение UnhandledPromiseRejectionWarning означает, что ошибки не были правильно обработаны в login, в то время как они должны были.Как объяснено в этом ответе , 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;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...