Mongoose钩子“pre/post save”在findOneAndUpdate中无效

4
我正在使用nodejs + express + mongoose。
我为一个模块添加了"pre/post save"钩子,它可以与save函数很好地配合使用。但是,当我使用findOneAndUpdate(如果不存在则创建)时,这个钩子没有被调用。
似乎我唯一能做的就是将findOneAndUpdate分成两个函数,先搜索项目,然后再进行创建。
有没有更好的方法来解决这个问题?
2个回答

11

从mongoose文档中可以看到:

虽然在使用findAndModify辅助函数时值会转换为其适当的类型,但以下功能不会被应用:

  • 默认值
  • setters(Setter是对属性进行预处理的函数)
  • 验证器
  • 中间件

如果您需要这些功能,请使用传统方法首先检索文档。

参考链接

更新: 自Mongoose 4.0起,你可以使用runValidators选项,如下面的变更日志所述:

#860:在update()和findOneAndUpdate()调用中,如果创建了一个新文档,则可以选择运行验证器并设置默认值。为了访问这些特性,必须在调用update()或findOneAndUpdate()时显式设置runValidators和setDefaultsOnInsert选项。请注意,在MongoDB <= 2.2中,setDefaultsOnInsert选项与之不兼容。进一步注意,update()和findOneAndUpdate()将显式以null上下文(即,在验证器函数中this === null)运行验证器。


2
{ runValidators: true } 是mongoose 4中可用的第三个参数。 - a77icu5

0
我选择了另一种方法。基本上,我的所有逻辑都在“Pre-save”中间件中。然后,当我想要在“findOneAndUpdate”中间件上更新值时,我保存文档。这会再次触发逻辑。可能对某人有帮助。

当你保存它时,它是真实的,但这会触发预保存中间件。 - CyberMessiah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接