уверен, что вы можете сократить свой код, но прежде всего есть несколько неправильных представлений об обещаниях.В конце я даю вам решение и другую короткую версию.Но я бы порекомендовал вам по-настоящему попытаться понять обещания подробно, прежде чем просто использовать этот код.Это важная часть JavaScript.
https://www.datchley.name/es6-promises/
https://www.datchley.name/promise-patterns-anti-patterns/
1.Попробуйте
.then(user.verifyPassword(req.body.password))
, тогда должен принять функцию.Но вы передаете результат verifyPassword, который является объектом Promise.Ваше выражение становится then(null)
, так что предыдущий результат user.exists()
проходит через.
Вместо этого вы можете сделать следующее:
user.exists()
.then(() => user.verifyPassword(req.body.password))
2.Попробуйте
Очевидно, что неверный результат (ошибка не была обнаружена и все еще сделал успешный вход в систему).Я полагаю, что это потому, что user.verifyPassword () не возвращает свое обещание.
Посмотрите на сигнатуру функции bind :
`function.bind (thisArg [, arg1 [, arg2 [, ...]]]) ``
Итак, вы передаете req.body.password как thisArg.Это игнорируется, потому что пользователь был инициирован с новым. Но теперь нет arg1 , поэтому поставкиПароль не определен.
Вместо этого вы должны сделать:
user.verifyPassword.bind(null, req.body.password)
3.Попробуйте
Вы не вызываете verifyPassword и одобрено здесь.Итак, попробуйте это так:
.then(()=>{return user.isApproved()})
или даже короче:
.then( () => user.isApproved() )
Решение
user.exists()
.then(() => user.verifyPassword(req.body.password))
.then(user.isApproved)
.then(()=>{
console.log("Login successful");
}).catch(err=>{
console.log("ERROR", err);
throw err
});
Сокращенное решение
Если вы хотите использовать еще более короткий синтаксис, вы можете использовать async / await. Это видео на YouTube может помочь вам.
async () => {
try {
await user.exists();
await user.verifyPassword(req.body.password);
await user.isApproved();
console.log("Login successful");
} catch(err) {
console.log("ERROR", err);
throw err
}