首页 > 解决方案 > 如何判断 document.save 是否在猫鼬中进行?

问题描述

我正在寻找一种方法来检查文档是否已经保存,try {document.save()} catch (e) {if (e.name == 'ParallelSaveError') {...}}但是一些快速的谷歌搜索没有找到这样的东西。

(猫鼬版本 5.7.3,fwiw)

上下文,因为我觉得我可能面临XY 问题的风险:

从不同端点更新同一个对象时,我想避免ParallelSaveError,并且由于各种原因,我正在使用缓存对象。我正在考虑编写一个saveDebounce基本上执行以下操作的函数:

我完全疯了吗?一个更明智的解决方案是否会涉及不以这种方式使用缓存,或者使用Model.update(...)而不是document.save()

(就其价值而言,Model.update在这里使用起来有点困难,因为我不仅要覆盖数据,而且还需要合并它,但我想我可以获取精益,创建合并版本,然后更新 db 中的对象,然后使用该更新版本刷新缓存...)

标签: mongodbmongoose

解决方案


好的,这就是我所经历的。更短的去抖时间似乎太快了。我不是在任何地方都使用它,而是在可能与其他东西并行调用的主要地方,例如与前端操作相关联的端点,这些操作通常PUT基本上同时导致多个请求。

似乎工作得很好,让我可以使用我所有的原始pre validatepre save钩子。如果结果是一场灾难,我会更新这篇文章

UserSchema.methods.saveWithRetriesForParallelism = async function () {
  if (arguments.length) {throw new Error("Warning: saveWithRetriesForParallelism doesn't support callbacks")}
  const user = this
  const nRetries = 5
  let debounceTime = 100
  try {
    return await user.save()
  } catch (err) {
    if (err.name !== 'ParallelSaveError') {
      throw err
    }
    for (var i = 0; i < nRetries; i++) {
      console.log("ParallelSaveError - retry in " + debounceTime)
      await cu.waitNmillis(debounceTime)
      try {
        return await user.save()
      } catch (err2) {
        if (err.name !== 'ParallelSaveError') {
          throw err2
        }
        debounceTime*=2
      }
    }
    throw err
  }
}


推荐阅读