【问题标题】:Mongoose Schema.pre insertMany middlewareMongoose Schema.pre insertMany 中间件
【发布时间】:2021-01-09 17:48:57
【问题描述】:

我正在使用带有 nodeJs 的猫鼬,并且我正在尝试实现一个在使用 insertMany 时调用的中间件。 在猫鼬文档中根本没有示例,但他们确认 insertMany 模型功能 触发以下中间件: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(),代码将不会继续到下一个中​​间件,并且在这两种情况下都不会插入用户。

有人可以帮我吗?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    这是因为你在回调中提供了错误的参数。挂钩仅适用于“下一个”参数。您需要将回调函数参数从 (err, docs, next) 更改为 (next, docs),它应该适合您。

    您可以在此处查看详细信息 https://mongoosejs.com/docs/middleware.html#pre

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

    【讨论】:

    • 感谢您的回答。请问,你在哪里找到的论点?在 mongoose 文档中,顺序是第二个参数,而不是第一个。
    • 在我发送的链接中,你可以看到他们使用 next 作为第一个参数
    • 在该链接中,与文档的其余部分一样,根本没有关于 insertMany 钩子的示例。无论如何,您的建议有效:) 谢谢!
    • 从 mongoose 5.10.8 开始,我必须执行 (docs, next) 才能使其正常工作:(next, docs) 是错误的。
    猜你喜欢
    • 1970-01-01
    • 2016-06-27
    • 2021-06-03
    • 2016-07-02
    • 1970-01-01
    • 2018-12-29
    • 2021-12-10
    • 2017-10-06
    • 1970-01-01
    相关资源
    最近更新 更多