Ошибка параллельного сохранения в обработчике поста mongoose. Не удается сохранить () один и тот же документ несколько раз параллельно - PullRequest
0 голосов
/ 11 декабря 2019

Итак, вот проблема, с которой я сталкиваюсь, когда использую ловушку 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 голосов
/ 11 декабря 2019

Я не знаю, почему вы пытаетесь сохранить документ несколько раз в хуке инициализации. AFAIK это не обязательно. Я бы полностью отбросил строку await doc.save(); (и сделал бы функцию не асинхронной). Все равно должно быть в порядке, если вы позже сохраните документ.

Ошибка возникает именно по той причине, что в сообщении об ошибке указано: Вы пытаетесь сохранить несколько раз документа параллельно.

Оформить заказ https://mongoosejs.com/docs/middleware.html#post-async
Вы не используете схему асинхронной функции, потому что вы должны вызывать next(), когда закончите асинхронную обработку.

Так что либо не сохраняйте документ в ловушке, либо используйтеnext() обратный вызов при выполнении асинхронных операций.

...