2017-07-28 2 views
1

J'utilise un crochet de pré-sauvegarde avec bcrypt pour crypter les mots de passe sur le système. Cela fonctionne très bien lors de la création ou de la modification d'un mot de passe. Le problème est qu'il semble re-crypter le mot de passe chaque fois que je change et enregistrer un champ différent, par exemple e-mail.Mongoose change de mot de passe chaque fois que j'économise avec le crochet de pré-enregistrement

Probablement plus facile à expliquer avec du code. Voici le modèle:

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

Et le crochet:

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(); 
     }) 
    }) 
}); 

Et voici mon code pour mettre à jour l'adresse e-mail:

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); 
     }) 

    }) 
} 

Alors, quand je l'appelle doc.save dans le dernier exemple , il met à jour l'adresse e-mail comme prévu mais il rechiffre également le mot de passe, ce qui signifie que si l'utilisateur se déconnecte, il ne peut plus se reconnecter.

Quelqu'un peut-il vous aider à contourner ce problème?

Répondre

1

Essayez ceci:

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

Haha, je me suis juste et ajouté ma propre réponse! J'ai cependant marqué le vôtre comme la bonne réponse, pour vous remercier d'avoir pris le temps! – Chris

+0

Haha, merci Chris –

0

OK, j'ai réussi à le comprendre - juste besoin d'un peu de logique conditionnelle dans le crochet de pré-enregistrement:

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(); 
     }) 
    }) 
});