Схема Мангуста. предварительно вставить много промежуточного программного обеспечения

#node.js #mongodb #mongoose

#node.js #mongodb #мангуст

Вопрос:

Я использую mongoose с NodeJS и пытаюсь реализовать промежуточное программное обеспечение, вызываемое при использовании insertMany . В документации mongoose вообще нет примеров, но они подтверждают, что функция модели insertMany запускает следующее промежуточное программное обеспечение: insertMany() .

У меня есть базовая схема пользователя, и мне нужно вставить много крючков для хеширования пароля с помощью 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();
});
  

Я не публикую всю схему, потому что все остальное работает, включая хэширование паролей и «сохранение» перехватов.
Я не могу понять, почему я получаю эту ошибку, когда пытаюсь вставить много пользователей:

next не является функцией

Обычно я вызываю next(), чтобы перейти к следующему промежуточному программному обеспечению, но в этом случае это не работает. Если я удалю next() , код не перейдет к следующему промежуточному программному обеспечению, и в обоих случаях пользователи не будут вставлены.

Кто-нибудь может мне помочь?

Ответ №1:

Это потому, что вы предоставляете неправильные аргументы при обратном вызове. Крюк применяет только аргумент ‘next’. Вам нужно изменить аргументы функции обратного вызова с (err, docs, next) на (next, docs), и это должно сработать для вас.

Подробности вы можете увидеть здесь https://mongoosejs.com/docs/middleware.html#pre

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

Комментарии:

1. спасибо за ваш ответ. Пожалуйста, где вы нашли аргументы? В документах mongoose порядок является следующим в качестве вторых параметров, а не первым.

2. в ссылке, которую я отправил, вы можете видеть, что они используют next в качестве первого параметра

3. в этой ссылке, как и в остальной документации, вообще нет примера о крючке insertMany. Во всяком случае, ваше предложение работает 🙂 Спасибо!

4. начиная с mongoose 5.10.8, я должен был сделать (docs, next), чтобы заставить его работать: (next, docs) был неправильным.