Экспресс-сбой сервера при появлении нового исключения в функции асинхронного авторизации

#javascript #node.js #express

#javascript #node.js #экспресс

Вопрос:

Эта проблема сводит меня с ума… У меня есть исключение throw, из-за которого мой сервер Express выходит из строя в моей функции асинхронного входа. Проблема в том, что ошибка не передается в catch try / catch. Пользовательские данные хорошо получены из базы данных.

Новое исключение throw работает нормально, если оно выбрасывается за пределы моей функции bcrypt.

 module.exports.login = async (req, res, next) => {
  try {
    const {
      username,
      password
    } = req.body;
    if (!username) {
      throw new MissingRequiredParameterError({
        info: {
          body: ['usename']
        }
      });
    }

    if (!password) {
      throw new MissingRequiredParameterError({
        info: {
          body: ['password']
        }
      });
    }
    const user = await User.find({
      username: username
    }).exec();

    // throw new BadCredentialsError({                 // Exception works fine
    //   message: 'Username or password is incorrect'  // if those lines
    // });                                             // are uncommented

    if (user != '') {
      await bcrypt.compare(password, user[0].password, (errBcrypt, resBcrypt) => {
        if (!resBcrypt) {                              // is false if password is wrong
          throw new BadCredentialsError({ // Line 85 THIS Exceptions makes my server crash if password is wrong !
            message: 'Username or password is incorrect'
          });
        } else {
          // Generate token
          const {
            accessToken,
            refreshToken
          } = await generateToken(user[0]);

          await res.json({
            accessToken,
            accessTokenExpiresIn: config.accessToken.expiresIn,
            refreshToken,
            refreshTokenExpiresIn: config.refreshToken.expiresIn
          });
        }
      });
    } else {
      throw new BadCredentialsError({
        message: 'Username or password is incorrect'
      });
    }


  } catch (err) {
    console.error('pass', err.stack);
    next(err);
  }
};
  

Посмотрите на сбой :

 C:UsersrebebAttilaattila-srvapicontrollersauth.js:85
          throw new BadCredentialsError({
                ^
bad_credentials: Username or password is incorrect
    at C:UsersrebebAttilaattila-srvapicontrollersauth.js:85:17 {
  jse_shortmsg: 'Username or password is incorrect',
  jse_info: {},
  isHTTPError: true,
  status: 401,
  expose: true
}
[nodemon] app crashed - waiting for file changes before starting...
  

Ответ №1:

Вместо этого должно быть что-то подобное:

var resBcrypt = await bcrypt.compare(password, user[0].password); Прежде чем продолжить без обратного вызова.

Происходит то, что ошибка выдается внутри самого обратного вызова, а не в том же потоке кода, что и ожидающий вызов.

Если метод не поддерживает синтаксис, основанный на обещаниях, вам, возможно, придется сначала «пообещать» метод.

https://javascript.info/promisify

Комментарии:

1. Спасибо, мой друг… проблема решена. Большое спасибо!

2. Не беспокойтесь, очень рад помочь! Обязательно отметьте этот ответ как решенный. Удачи!