0
votes

Pourquoi la validation s'exécute sur la mise à jour du champ en mangouste?

Je sais qu'il ne devrait pas y avoir de validation sur la mise à jour du champ, mais elle s'exécute quand même lorsque j'essaye de migrer une base de données.

Fait partie de la migration:

email: {
  type: String,
  validate: {
    validator: email => User.doesntExist({ email }),
    message: ({ value }) => `Email ${value} has already been taken`
  }
}

Une partie du schéma:

const arr = await User.find({ ban: { $exists: true } });
arr.forEach(async item => {
  // this works
  // await User.updateOne({ _id: item._id }, { ban: false });
  // this doesn't
  item.ban = false;
  await item.save();
});

"ValidationError: La validation de l'utilisateur a échoué: email: Email guest1@ex.com a déjà été pris"


0 commentaires

3 Réponses :


0
votes

https://mongoosejs.com/docs/validation.html#validation

La validation est un middleware. Mongoose enregistre la validation en tant que hook de pré ('save') sur chaque schéma par défaut.

updateOne ne déclenche pas la sauvegarde du hook.


1 commentaires

mongoosejs.com/docs/documents.html#updating doc.save fonctionne comme updateOne et ne déclenche pas le pré ('save')



1
votes

Vous le faites correctement, car comme signalé dans la documentation de mangouste :

La fonction save () est généralement la bonne façon de mettre à jour un document avec Mongoose. Avec save (), vous obtenez une validation complète et un middleware.

Mais, lorsque vous appelez la fonction .save () , tous les validateurs sont appelés, y compris votre validateur de messagerie utilisateur:

validator: email => User.doesntExist({ email })

Et dans votre cas, c'est un problème, car l'utilisateur en cours de validation est déjà enregistré dans la base de données ... Donc, pour éviter cela, vous devez utiliser le . update () pour mettre à jour vos utilisateurs.


0 commentaires

1
votes

Il existe une option pour désactiver le validateur à déclencher dans mangouste save () , qui est validateBeforeSave . (depuis la version 4.4.2 de la mangouste)

Essayez donc d'utiliser save ({validateBeforeSave: false}) si vous souhaitez continuer à utiliser save () au lieu de update () .


0 commentaires