Mon goose ловушка pre save: next () вызывается перед присвоением поля - PullRequest
0 голосов
/ 25 апреля 2020

Прежде чем углубиться в это, я знаю, что next () будет вызван до того, как будут завершены асин c операции. Но простое назначение свойства объекта не асинхронно, и я не уверен, почему next () вызывается перед этим назначением. Также обратите внимание, что я пробовал несколько версий этого.

Я пытаюсь установить свойство weekNum в моей модели только при создании нового документа. Вот мой текущий код:

Schema.pre('save', async function (next) {
  if (this.isNew) {
    await this.constructor.countDocuments({ type: `${this.type}` }, function (err, count) {
      if (err) {
        console.log(err)
      } else {
        this.weekNum = count + 1;
        console.log(this.weekNum); // this returns the correct variable in my console
        next(); // when I request the created document, it has no weekNum property. 
      }
    });
  }
  else {
    next();
  }
});

Я также попытался переместить next () за пределы и сразу после оператора await. Однако next () никогда не ожидает завершения этой операции. Как я могу убедиться, что мы не сохраним документ до обновления поля?

1 Ответ

0 голосов
/ 25 апреля 2020

Я понял - оказалось, что я смешивал асинхронное ожидание с обратным вызовом. Вот один правильный способ сделать это:

Schema.pre('save', async function (next) {
  try {
    if (this.isNew) {
      const count = await this.constructor.countDocuments({ type: `${this.type}` })
      this.weekNum = count + 1;
      console.log(this.weekNum);
      next();
    }
    else {
      next();
    }
  }
  catch(err) {
    console.log(err);
    next();
  }
});
...