Почему сравнение bcrypt не работает? Почему isMatch возвращет false, хотя candidatePassword возвращает корректный пароль, и хеш сохраняется в базе тоже корректно.userSchema.methods.comparePassword = function (candidatePassword, cb) { bcrypt.compare(candidatePassword, this.password, function (err, isMatch) { if (err) { console.log('err') return cb (err) } console.log(candidatePassword) console.log(isMatch) cb (null, isMatch) }) } Есть подозрение, что он не может из базы взять пароль из за ассинхронности, такое может быть? Потому что я не могу вывести в консоль this.password
Да, возможно проблема связана с асинхронностью выполнения кода. Возможно, к моменту выполнения функции bcrypt.compare(), значение this.password еще не было получено из базы данных.
Для того чтобы убедиться в этом, попробуйте вывести в консоль значение this.password перед вызовом функции bcrypt.compare() в вашем методе comparePassword. Если значение this.password не выводится корректно, то это может быть причиной того, почему сравнение не работает.
Для решения этой проблемы, вам нужно убедиться, что значение this.password было успешно получено из базы данных до вызова bcrypt.compare(). Вы можете использовать промисы или колбэки для обработки этой задачи.
Пример использования промисов:
userSchema.methods.comparePassword = function (candidatePassword) { return new Promise((resolve, reject) => { // Получаем значение this.password из базы данных // Затем сравниваем пароли и вызываем resolve(true) или resolve(false) в зависимости от результата bcrypt.compare(candidatePassword, this.password, function (err, isMatch) { if (err) { reject(err); } else { resolve(isMatch); } }); }); }; // Использование метода comparePassword user.comparePassword(candidatePassword) .then((isMatch) => { console.log(isMatch); }) .catch((err) => { console.error(err); });
Таким образом, вы можете убедиться, что значение this.password успешно получено из базы данных перед сравнением паролей.
Да, возможно проблема связана с асинхронностью выполнения кода. Возможно, к моменту выполнения функции bcrypt.compare(), значение this.password еще не было получено из базы данных.
Для того чтобы убедиться в этом, попробуйте вывести в консоль значение this.password перед вызовом функции bcrypt.compare() в вашем методе comparePassword. Если значение this.password не выводится корректно, то это может быть причиной того, почему сравнение не работает.
Для решения этой проблемы, вам нужно убедиться, что значение this.password было успешно получено из базы данных до вызова bcrypt.compare(). Вы можете использовать промисы или колбэки для обработки этой задачи.
Пример использования промисов:
userSchema.methods.comparePassword = function (candidatePassword) {return new Promise((resolve, reject) => {
// Получаем значение this.password из базы данных
// Затем сравниваем пароли и вызываем resolve(true) или resolve(false) в зависимости от результата
bcrypt.compare(candidatePassword, this.password, function (err, isMatch) {
if (err) {
reject(err);
} else {
resolve(isMatch);
}
});
});
};
// Использование метода comparePassword
user.comparePassword(candidatePassword)
.then((isMatch) => {
console.log(isMatch);
})
.catch((err) => {
console.error(err);
});
Таким образом, вы можете убедиться, что значение this.password успешно получено из базы данных перед сравнением паролей.