猫鼬发布初始化钩子中的并行保存错误。无法并行保存()相同文档多次

时间:2019-12-11 18:58:23

标签: javascript node.js mongodb mongoose fastify

所以这是一个问题,当我使用post init钩子时,只要日期更改,我都会更新数据库中的某些值。但是,当我尝试进行get调用时,会出现并行保存错误,但是数据库中的值会更新,并且如果我再次尝试按api,它的工作原理就很好,所以为什么我一次却没有得到这个并行保存错误再次直到日期再次更改。

influencerSchema.post('init', async function (doc) {
  let metaData = influencerModel.metaData();
  let refreshFields = metaData.refreshFields;
  for (let i = 0; i < refreshFields.length; i++) {
    if (new Date(doc.currentMembership[refreshFields[i]].dailyCount.date).setHours(0, 0, 0, 0) != new Date().setHours(0, 0, 0, 0)) {
      doc.currentMembership[refreshFields[i]].dailyCount.date = Date.now();
      doc.currentMembership[refreshFields[i]].dailyCount.count = doc.currentMembership[refreshFields[i]].count;
      await doc.save();
    }
  }
});

此处刷新字段为

refreshFields: ['likes', 'messages', 'matches', 'backtrack']

任何帮助都会很棒 谢谢!

1 个答案:

答案 0 :(得分:0)

我不知道您为什么首先尝试在init挂钩中多次保存该文档。 AFAIK这不是必需的。我将完全删除行await doc.save();(并使函数不异步)。如果以后仍然保存文档,应该可以。

发生此错误的原因恰恰是错误消息指出的原因:您正在尝试并行保存文档的多个时间。

结帐https://mongoosejs.com/docs/middleware.html#post-async
您未使用异步功能架构,因为完成异步处理后,您需要调用next()

因此,不要将文档保存在挂钩中,或者在处理完异步内容后使用next()回调。