#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);
Прежде чем продолжить без обратного вызова.
Происходит то, что ошибка выдается внутри самого обратного вызова, а не в том же потоке кода, что и ожидающий вызов.
Если метод не поддерживает синтаксис, основанный на обещаниях, вам, возможно, придется сначала «пообещать» метод.
Комментарии:
1. Спасибо, мой друг… проблема решена. Большое спасибо!
2. Не беспокойтесь, очень рад помочь! Обязательно отметьте этот ответ как решенный. Удачи!