Javascript 为什么.findByIdAndUpdate会绕过mongoose中间件?
我在这里搜索了这个问题,但作为一个初学者,答案有点复杂,有点让我费解。我使用bcrypt散列密码,并设置了模式,允许我使用中间件查看用户是否在散列密码之前修改密码(初始创建或更新密码) 这在post路由上没有问题,但是如果我使用补丁路由,就会有问题,并且我的中间件不会运行 有人能帮我用一种更简单的方式(即通俗易懂的英语)理解为什么这会绕过猫鼬吗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
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。