Node.js 猫鼬钩;“保存前/保存后”;不为findOneAndUpdate工作

Node.js 猫鼬钩;“保存前/保存后”;不为findOneAndUpdate工作,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我正在使用nodejs+express+mongoose 我为一个模块添加了“pre/post save”钩子,它可以很好地使用save功能。 但是当我使用findOneAndUpdate(如果不存在则创建)时,不会调用钩子 看来我唯一能做的就是把findOneAndUpdate分成两个函数,先搜索项目,然后再创建 有没有更好的办法来解决这个问题?来自mongoose文档: 尽管在使用findAndModify帮助程序时会将值强制转换为相应的类型,但以下内容不适用: 默认值 二传手 验证器 中

我正在使用nodejs+express+mongoose

我为一个模块添加了“pre/post save”钩子,它可以很好地使用save功能。 但是当我使用findOneAndUpdate(如果不存在则创建)时,不会调用钩子

看来我唯一能做的就是把findOneAndUpdate分成两个函数,先搜索项目,然后再创建


有没有更好的办法来解决这个问题?

来自mongoose文档:

尽管在使用findAndModify帮助程序时会将值强制转换为相应的类型,但以下内容不适用:

  • 默认值
  • 二传手
  • 验证器
  • 中间件
如果需要这些功能,请使用传统的方法首先检索文档

更新:自Mongoose 4.0以来,您可以使用Changelog中的
runValidators
选项:


:如果在update()和findOneAndUpdate()调用中创建了新文档,则可以选择运行验证器并设置默认值。为了访问这些功能,在调用update()或findOneAndUpdate()时,必须显式设置runValidators和setDefaultsOnInsert选项。请注意setDefaultsOnInsert选项与MongoDB不兼容我选择了另一种方法。基本上,我所有的逻辑都在预保存中间件中。然后,当我想更新findOneAndUpdate中间件上的值时,我正在保存文档。这再次触发了逻辑。可能对某些人有帮助。

{runValidators:true}作为mongoose 4True中的第三个参数可用,但在保存它时,会触发预保存中间件。