Не открих (или не открих) проблем с вашия код, но имам предложение за проследяване на грешката.
Този блок от код е рискован. Може случайно да актуализирате полето за парола и да задействате процеса на преразглеждане на паролата.
UserSchema.pre('save', function(next) {
var user = this;
var SALT_FACTOR = 12; // 12 or more for better security
if (!user.isModified('password')) return next();
console.log(user.password) // Check accident password update
bcrypt.genSalt(SALT_FACTOR, function(err, salt) {
if (err) return next(err);
bcrypt.hash(user.password, salt, null, function(err, hash) {
if (err) return next(err);
user.password = hash;
next();
});
});
});
Поставете console.log
точно след if (!user.isModified('password'))
за да проверите за неочаквана актуализация на паролата. Сега опитайте отново да забравите паролата и вижте дали има някаква грешка.
*TD;LR Отделете паролата за актуализиране в нов метод, вместо да я поставите в предварителното запазване, тъй като може случайно да актуализирате нова парола заедно с други полета
*Актуализация:Благодаря #imns за предлагане на по-добро число на SALT_FACTOR.