Я думаю, что проблема заключается в этой строке:
const hash = await User.hashPassword(result.value.password);
Это означает, что User.hashPassword(result.value.password)
должно возвращать обещание (но оно возвращает ссылку на неправильное обещание).
module.exports.hashPassword = (password) => {
return hash = bcrypt.genSalt(10, function (err, salt) {
bcrypt.hash(password, salt, function (err, hash) {});
});
};
Возможно, поможет модификация вышеприведенного, чтобы вернуть обещание .. Вот так:
module.exports.hashPassword = (password) => {
var salt = await bcrypt.genSalt(10);
return bcrypt.hash(password, salt);
};
Чтобы ответить на ваш вопрос о @returns Promise If callback has been omitted
:
Методы Bcrypt являются асинхронными. Это означает, что они немедленно возвращаются и обрабатывают в фоновом режиме. Когда результат доступен, функция делает его доступным для вызывающего кода либо через функцию обратного вызова, либо через обещание.
Рассмотрим следующий API для genSalt
из документов:
genSalt (раунды, минор, кб)
раундов - [ДОПОЛНИТЕЛЬНО] - стоимость обработки данных. (по умолчанию - 10)
minor - [ДОПОЛНИТЕЛЬНО] - дополнительная версия bcrypt для использования. (по умолчанию - b)
cb - [ДОПОЛНИТЕЛЬНО] - обратный вызов, который должен быть запущен после генерации соли. использует eio, делая его асинхронным. Если cb не указан, Promise возвращается, если доступна поддержка Promise.
err - First parameter to the callback detailing any errors.
salt - Second parameter to the callback providing the generated salt.
То, что говорит genSalt
, может принимать три аргумента: genSalt(rounds, minor, cb)
Пример использования обратных вызовов
Если вызывающий код хочет получить результат через обратный вызов, он может передать функцию, которая выглядит как function(err, salt){}
, в качестве параметра cb
.
bcrypt.genSalt(rounds, minor, function(err, salt){
if(err){
//Handle error
return;
}
// Salt is available here
console.log(salt);
});
Образец с обещаниями
Если параметр cb не передан (нулевой или неопределенный), функция возвращает вместо этого Promise.
var promise = bcrypt.genSalt(rounds, minor);
promise
.then(function(salt){
// Salt is available here
console.log(salt);
})
.catch(function(err){
// Handle error
});