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

Javascript 为什么.findByIdAndUpdate会绕过mongoose中间件?,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我在这里搜索了这个问题,但作为一个初学者,答案有点复杂,有点让我费解。我使用bcrypt散列密码,并设置了模式,允许我使用中间件查看用户是否在散列密码之前修改密码(初始创建或更新密码) 这在post路由上没有问题,但是如果我使用补丁路由,就会有问题,并且我的中间件不会运行 有人能帮我用一种更简单的方式(即通俗易懂的英语)理解为什么这会绕过猫鼬吗 const user = await User.findByIdAndUpdate(req.params.id, req.body, { new: tr

我在这里搜索了这个问题,但作为一个初学者,答案有点复杂,有点让我费解。我使用bcrypt散列密码,并设置了模式,允许我使用中间件查看用户是否在散列密码之前修改密码(初始创建或更新密码)

这在post路由上没有问题,但是如果我使用补丁路由,就会有问题,并且我的中间件不会运行

有人能帮我用一种更简单的方式(即通俗易懂的英语)理解为什么这会绕过猫鼬吗

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()

应该是这样的:

User.update({username: oldUsername}, {
    username: newUser.username, 
    password: newUser.password
}, function(err, numberAffected, rawResponse) {
   //handle it
});

它非常简单:您想要的中间件类型(称为
查询中间件
)只支持/激发某些方法。例如:

查询中间件支持以下模型和查询 功能。在查询中间件函数中,这指的是查询

  • 计数
  • 删除许多
  • 删除一个
  • 发现
  • 芬顿
  • findOneAndDelete
  • findOneAndRemove
  • findOneAndUpdate
  • 除去
  • 更新
  • updateOne
  • 更新手册
因此,您使用的方法基本上不会触发任何中间件。您必须使用
findOneAndUpdate
update
updateOne
updateMany
来执行此操作

在你的第二个例子中,它实际起作用。这是因为您实际上正在使用文档中间件

Mongoose有4种类型的中间件:文档中间件,模型 中间件、聚合中间件和查询中间件。文件 中间件支持以下文档功能。在里面 文档中间件功能,这是指文档

以下设备支持文档中间件:

  • 证实
  • 保存
  • 除去
  • init(注意:init钩子是同步的)

如您所见,支持
save
,因此中间件启动。

谢谢。这是有道理的。跟进问题。你知道有哪个网站会用更简单的术语分解文档(比如文档培训轮),直到初学者能够熟练地阅读和理解这些内容为止?这是猫鼬的一个普遍问题。你在他们的官方文件中看到的就是你得到的。最好从MongoDB文档开始,然后真正过渡到mongoose。