Não encontrei (ou não encontrei) nenhum problema com seu código, mas tenho uma sugestão para rastrear o bug.
Este bloco de código é arriscado. Você pode atualizar acidentalmente o campo de senha e acionar o processo de rehash de senha.
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();
});
});
});
Coloque um
console.log
logo após o if (!user.isModified('password'))
para verificar se há atualização inesperada de senha. Agora tente novamente esquecer a senha e veja se há algum bug lá. *TD;LR Separe a senha de atualização em um novo método em vez de colocá-la no pré-salvar, pois você pode atualizar acidentalmente uma nova senha junto com outros campos
*Atualização:obrigado #imns por sugerir um número SALT_FACTOR melhor.