在 Mongoose 保存后挂钩中捕获并忽略/抑制错误

Posted

技术标签:

【中文标题】在 Mongoose 保存后挂钩中捕获并忽略/抑制错误【英文标题】:Catch and ignore/suppress errors in Mongoose post-save hook 【发布时间】:2019-01-09 09:14:47 【问题描述】:

是否可以在 Mongoose 保存后挂钩中捕获并忽略错误,从而从文档 save 调用成功返回(分别是已解决的承诺)?

示例代码:

schema.post('save', function postSave(err, doc, next) 
  if (err.name === 'MongoError' && err.code === 12345) 
    // this does not work the way I'd expect it to
    return next();
  
  return next(err);
);

上面的钩子仍然导致save 调用失败并出现原始错误(next(null) 也无济于事)。我可以通过将自定义错误传递给next 来替换错误,这表明该机制通常可以正常工作,但这对我没有帮助。

Mongoose middleware docs 包含一个非常相似的示例(请参阅底部附近的“错误处理中间件”部分),但并未真正解释 next 回调的预期行为。

就上下文而言,我在实际项目中尝试完成的是一个保存后中间件挂钩,当遇到重复键错误时会重试保存调用。

【问题讨论】:

【参考方案1】:

但是,有一种特殊的 post 中间件,称为“错误处理中间件”,专门在发生错误时执行。错误处理中间件对于报告错误和使错误消息更具可读性很有用。

我认为在钩子链中执行此操作为时已晚。 pre "save" 钩子似乎是检查duplicate keys 的好地方,不是吗?在那里你可以出错,然后在你的代码中重试你认为合适的。

error handling middleware 实际上更像是一种错误格式化机制。

【讨论】:

预保存钩子不适用于此用例,因为总是有(尽管很小)另一个进程在钩子和实际写入调用之间使用相同键写入文档.当然,在调用代码时显式重试是可行的,但远不如中间件解决方案那么优雅。不过谢谢!你是对的,文档有点暗示这不是一个预期的用例。

以上是关于在 Mongoose 保存后挂钩中捕获并忽略/抑制错误的主要内容,如果未能解决你的问题,请参考以下文章

通过 Model.save() 更新时触发 Mongoose 预保存挂钩

如何从 Node.js / Express 应用程序的 Mongoose 预挂钩中查询?

如何从 Node.js / Express 应用程序的 Mongoose 预挂钩中查询?

如何捕获在Visual Studio 2015中单击“保存工作项”按钮时触发的事件?

抑制但捕获 R 中的警告

使用 mongoose 钩子重试保存重复键错误