4

我正在使用 nodejs + express + mongoose。

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

似乎我能做的唯一方法是将 findOneAndUpdate 分离到两个函数,首先搜索项目然后创建。

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

4

2 回答 2

11

来自猫鼬文档:

尽管在使用 findAndModify 帮助器时将值转换为适当的类型,但以下内容不适用:

  • 默认值
  • 二传手
  • 验证者
  • 中间件

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

参考

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

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

于 2013-10-18T10:55:16.220 回答
0

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

于 2020-05-24T09:01:38.050 回答