#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) был неправильным.