2017-07-28 68 views
1

我正在使用带bcrypt的预保存钩子来加密系统上的密码。在创建或更改密码时它工作正常。问题在于,每次更改并保存不同的字段时,似乎都会重新加密密码,例如电子邮件。Mongoose每次使用预保存钩子保存时都会更改密码

可能更容易用代码解释。这里的模型:

const UserSchema = new Schema({ 
    email: { 
     type: String, 
     required: true, 
     lowercase: true, 
     unique: true, 
     trim: true 
    }, 
    password: { 
     type: String, 
     required: true 
    } 
}) 

和钩:

UserSchema.pre('save', function(next){ 
    const user = this; 
    console.log(user); 
    bcrypt.genSalt(10, 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(); 
     }) 
    }) 
}); 

这是我的代码来更新电子邮件地址:

module.exports = function(req, res){ 
    User.findOne({ _id: req.body.user}, function(err, doc){ 
     if(err){ 
      console.log(err); 
      return; 
     } 

     doc.email = req.body.data; 
     doc.save(function(err, returnData){ 
      if (err){ 
       console.log(err); 
       return; 
      } 
      res.send(returnData); 
     }) 

    }) 
} 

所以,当我打电话doc.save在最后的例子,它会根据预期更新电子邮件地址,但它也会重新加密密码,这意味着如果用户登出,他们将无法再次登录。

任何人都可以帮助如何解决这个问题吗?

回答

1

试试这个:

UserSchema.pre('save', function(next){ 
    if (!user.isModified('password')) return next(); 

    const user = this; 

    bcrypt.genSalt(10, 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(); 
     }) 
    }) 
}); 
+0

哈哈,我只是想它出来并添加了我自己的答案!尽管如此,我已将你的标记标记为正确的答案,感谢你花时间! – Chris

+0

哈哈,谢谢克里斯 –

0

OK,我设法弄清楚 - 只需要条件逻辑的一点点在预存钩:

UserSchema.pre('save', function(next){ 
    if(!this.isModified('password')){ 
     return next(); 
    } // Adding this statement solved the problem!! 
    const user = this; 
    bcrypt.genSalt(10, 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(); 
     }) 
    }) 
});