Mongoose Schema.pre insert

Sep 23 2020

J'utilise mangouste avec nodeJs et j'essaie d'implémenter un middleware appelé lors de l'utilisation d'insertMany. Dans la documentation de mangouste, il n'y a pas d'exemple du tout, mais ils confirment que la fonction de modèle insertMany déclenche le middleware suivant: insertMany ().

J'ai un schéma utilisateur de base et j'ai besoin d'insérer de nombreux crochets pour hacher le mot de passe avec bcrypt:

UserSchema.pre('insertMany', async function (err, docs, next) {

  try{
    docs.map(async function (doc, index) {
      // async hash password
      doc.password = await User.hashPassword(doc.password);
    });

  } catch (error) {
    console.log(error);
  }

  next();
});

Je ne poste pas tous les schémas car tout le reste fonctionne, y compris le hachage de mot de passe et les hooks de sauvegarde. Je ne comprends pas pourquoi j'obtiens cette erreur lorsque j'essaye d'insérer de nombreux utilisateurs:

le suivant n'est pas une fonction

Habituellement, j'appelle next () pour passer au middleware suivant, mais dans ce cas, cela ne fonctionne pas. Si je supprime next (), le code ne passera pas au middleware suivant et dans les deux cas les utilisateurs ne seront pas insérés.

Est-ce que quelqu'un peut m'aider?

Réponses

1 PavloKostohrys Sep 23 2020 at 21:14

C'est parce que vous fournissez de mauvais arguments dans le rappel. Hook applique uniquement l'argument «suivant». Vous devez modifier les arguments de votre fonction de rappel de (err, docs, next) à (next, docs) et cela devrait fonctionner pour vous.

Détails que vous pouvez voir ici https://mongoosejs.com/docs/middleware.html#pre

https://mongoosejs.com/docs/middleware.html#types-of-middleware