Ты почти у цели.Вы правильно поняли, что correctPassword
выполняется асинхронно, хотя написано так, как если бы оно было синхронным.
Во-первых, давайте сделаем correctPassword
обещание, чтобы мы могли использовать async/await
или вызвать .then
для него
const correctPassword = (enteredPassword, originalPassword) => {
return new Promise(resolve => {
bcrypt.compare(enteredPassword, originalPassword, (err, res) =>{
resolve(res)
});
})
}
Далее, у вас есть два подхода, чтобы убедиться, что порядок операций в вашем коде выполняется правильно:
(рекомендуется) Используйте синтаксис async/await
, позволяющий нам писать синхронно выглядящий код:
authenticate: async (req, res) => {
let userDetails = req.query;
try {
const user = await User.findOne({
where: {
username: userDetails.username
}
});
const authenticated = await correctPassword(userDetails.password, user.password);
res.send(authenticated);
} catch(e) {
res.status(400).send(e)
}
}
Продолжайте использовать обещания:
authenticate: (req, res) => {
let userDetails = req.query;
User.findOne({
where: {
username: userDetails.username
}
}).then(() => {
correctPassword(userDetails.password, user.password)
.then(authenticated => {
res.send(authenticated)
})
.catch(e => {
res.send(e)
})
})
}