gpt4 book ai didi

javascript - 为什么 .findByIdAndUpdate 会绕过 mongoose 中间件?

转载 作者:可可西里 更新时间:2023-11-01 10:36:13 26 4
gpt4 key购买 nike

我在这里搜索过这个问题,但作为初学者,答案有点复杂,让我有点难以理解。我正在使用 bcrypt 来散列密码,并设置了我的架构以允许我使用中间件来查看用户是否在散列密码之前修改了密码(无论是在初始创建还是更新密码时)。

在发布路由上没有问题,但如果我使用补丁路由,我的中间件就不会运行。

有人可以帮助我以更简单的方式(即简单的英语)理解为什么这会绕过 mongoose 吗?:

const user = await User.findByIdAndUpdate(req.params.id, req.body, { new: true, runValidators: true })

不过,这是可行的:

const user = await User.findById(req.params.id)

updates.forEach((update) => user[update] = req.body[update])
await user.save()

最佳答案

其实很简单:你想要的中间件类型(称为query middleware)只支持/触发某些方法。例如from the documentation :

Query middleware is supported for the following Model and Query functions. In query middleware functions, this refers to the query.

  • 计数
  • 删除多个
  • 删除一个
  • 找到
  • 找到一个
  • 找到一个并删除
  • 找到一个并移除
  • findOneAndUpdate
  • 移除
  • 更新
  • 更新一个
  • 更新多个

所以基本上您使用的方法不会触发任何中间件。您必须使用 findOneAndUpdateupdateupdateOneupdateMany 来执行此操作。

在你的第二种情况下它确实有效。这是因为您实际使用的是文档中间件。

Mongoose has 4 types of middleware: document middleware, model middleware, aggregate middleware, and query middleware. Document middleware is supported for the following document functions. In document middleware functions, this refers to the document.

Document middleware is supported on:

  • 验证
  • 保存
  • 移除
  • init(注意:init hooks 是同步的)

如您所见,支持 save,因此中间件会触发。

关于javascript - 为什么 .findByIdAndUpdate 会绕过 mongoose 中间件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56844933/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com