Nie znalazłem (lub nie znalazłem) żadnego problemu z twoim kodem, ale mam sugestię, aby prześledzić błąd.
Ten blok kodu jest ryzykowny. Możesz przypadkowo zaktualizować pole hasła i uruchomić proces ponownego mieszania hasła.
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();
});
});
});
Umieść console.log
zaraz po if (!user.isModified('password'))
aby sprawdzić nieoczekiwaną aktualizację hasła. Teraz spróbuj ponownie zapomnieć hasło i sprawdź, czy jest tam jakiś błąd.
*TD;LR Oddziel hasło aktualizacji do nowej metody zamiast umieszczania go we wstępnym zapisie, ponieważ możesz przypadkowo zaktualizować nowe hasło wraz z innymi polami
*Aktualizacja:dziękuję #imns za sugerowanie lepszego numeru SALT_FACTOR.