在 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 预挂钩中查询?