0

所以这是我在使用 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']

任何帮助都会很棒谢谢!

4

1 回答 1

0

我不知道为什么您首先要在初始化挂钩中多次保存文档。AFAIK 这不是必需的。我会await doc.save();完全放弃(并使函数非异步)。如果您稍后保存文档应该没问题。

发生该错误的原因正是错误消息说明的原因:您正在尝试并行保存文档多次。

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

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

于 2019-12-11T20:18:57.917 回答