Функция asyn c не возвращает значение, но отображается после вызова неопределенного набора текста - PullRequest
0 голосов
/ 21 марта 2020

Ниже моя функция возвращает маркер входа в систему, когда я отлаживаю свою функцию, она ждет до возврата, но когда функция вызова возвращает неопределенное значение и ошибки также не определены, не знаю, почему это происходит

import userModel from '../Models/user.model';
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken')
let token = null;
process.env.SECRET_KEY = 'secret';


export default class loginController{

    static async login(user:any): Promise<any>{
        try{
              await userModel.findOne({
                  Email: user.Email
                })
                  .then(async (res:any) => {
                    if (user) {
                      if (await bcrypt.compareSync(user.Password, res.Password)) {
                        const payload = {

                          Firstname: res.Firstname,
                          Lastname: res.Lastname,
                          email: res.Email,

                        }

                        token = await jwt.sign(payload, process.env.SECRET_KEY, {
                          expiresIn: 1400
                        })
                        let decoded = jwt.verify(token, process.env.SECRET_KEY)

                        return token;
                      }
                       else {
                        return "Password is Wrong";
                      }

                    } 

                    else {
                        return 'Please Check Username';
                    }

                  })
                  .catch(err => {
                       return('error : ' + err)
                  })
              }  

        catch(err)
        {
            return err
        }
    }
}

И моя вызывающая функция

const router : Router = Router();

router.post('/login', async (req, res, next) => {

    try {
       const user = await loginController.login(req.body);
       res.json(user)
   } catch (error) {
       res.json(error)
   }
})

Я пытался вызвать ошибки, это также отладчик, ожидающий возврата значения ошибки, но показывающий неопределенное

Спасибо за помощь!

1 Ответ

0 голосов
/ 21 марта 2020

login функция не возвращает token из-за области видимости функции. Если у вас есть несколько обратных вызовов, вы можете заключить их в new Promise и использовать функцию resolve для возврата значений.

export default class loginController {
  static async login(user: any): Promise<any> {
    try {
      return new Promise(async (resolve, reject) => {
        await userModel
          .findOne({
            Email: user.Email
          })
          .then(async res => {
            if (user) {
              if (await bcrypt.compareSync(user.Password, res.Password)) {
                const payload = {
                  Firstname: res.Firstname,
                  Lastname: res.Lastname,
                  email: res.Email
                };

                const token = await jwt.sign(payload, process.env.SECRET_KEY, {
                  expiresIn: 1400
                });
                let decoded = jwt.verify(token, process.env.SECRET_KEY);

                resolve(token);
              } else {
                resolve('Password is Wrong');
              }
            } else {
              resolve('Please Check Username');
            }
          })
          .catch(err => {
            resolve('error : ' + err);
          });
      });
    } catch (error) {
      return error;
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...