Проблема в том, что когда внутри .then
внутри Promise
цепочки, Promise
не обязательно заботится о том, что вы возвращаете. В вашем
.then(user_result => {
if(!user_result) {
return response.json({ error: true, message: 'No account found by that email' });
}
user = user_result.dataValues;
return models.ResetPasswordRequests.findOne({ where: { user_email: user.email } })
})
интерпретатор будет обрабатывать return response.json
так же, как return models.Reset...
- он просто будет передан следующему .then
, ожидая разрешения Обещания, если выражение было Promise
. Как вы видели, это не вырвется из цепи. Либо извлеките функции в именованные функции, которые вы можете вызывать, основываясь на потоке управления (который немного многословен), либо используйте async
/ await
, что допускает нечто очень похожее на то, что вы делаете сейчас - с помощью async
/ await
, return
ing завершит функцию и, чтобы получить значение асинхронного вызова, используйте await
(вместо return
ing, чтобы следующий .then
мог справиться с этим).
Как это:
async function submit_reset_password_request (request, response) {
if(request.session.id) {
return response.json({ error: true, message: 'password reset cannot be requested during an sctive session' });
}
const { email } = request.body;
if(email) {
email = email.toLowerCase().trim();
}
if(!email) {
return response.json({ error: true, message: 'input is required' });
}
try {
const user_result = await models.Users.findOne({ where: { email } });
if(!user_result) {
return response.json({ error: true, message: 'No account found by that email' });
}
const user = user_result.dataValues;
const request_result = await models.ResetPasswordRequests.findOne({ where: { user_email: user.email } });
if(request_result) {
return response.json({ error: true, message: 'A password reset has already been requested for this email' });
}
const new_reset_request = await models.ResetPasswordRequests.create({ user_email: user.email });
const reset_request = new_reset_request.dataValues;
// send reset request email
const host = request.get('host');
const link = host.endsWith('/') ? (host + 'search') : (host + '/search');
const email_subject = 'Epsity - Password reset requested';
const email_html = templateEngine.PasswordReset_EMAIL({ user, reset_request, link });
const email_result = await sendgrid_manager.send_email(null, request.session.you.email, email_subject, email_html);
return response.json({ success: true, message: 'A password reset request has been sent to the provided email!' });
} catch(error) {
console.log(error);
return response.json({ error, message: 'Could not sumbit reset password request...' });
}
}