2017-07-28 65 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(); 
     }) 
    }) 
});