如何判断document.save是否在猫鼬中进行?

时间:2019-10-04 20:04:11

标签: mongodb mongoose

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

(猫鼬版本5.7.3,以前)

上下文,因为我觉得自己可能有XY Problem的风险:

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

  • 如果已经保存,请等到保存后再保存
  • 等待X毫秒,然后保存
  • (除非在此期间调用saveDebounce,否则将重置计时器)

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

(实际上,在这里很难使用Model.update,因为我不仅要覆盖数据,还需要合并数据,但是我想我可以获取精益数据,创建合并数据版本,然后更新db中的对象,然后使用该更新的版本刷新缓存...)

1 个答案:

答案 0 :(得分:0)

好的,这就是我所用的。较短的去抖动时间似乎太快了。我没有在任何地方使用它,而是在可能与其他东西并行调用的主要地方,例如与前端操作关联的端点,这些端点通常基本上同时导致多个 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
  }
}