Mongoose предварительно сохранить хук установить идентификатор автоматического приращения в документе - PullRequest
0 голосов
/ 15 июня 2019

Несколько подобных вопросов задавались ранее, но я не смог заставить ни одно из решений работать для этого варианта использования.

Я пытаюсь написать ловушку предварительной фиксации, которая генерирует автоИдентификационный номер приращения каждый раз при сохранении нового документа «записи».

Создание идентификатора автоинкремента работает.Я смог убедиться в этом, проверив файл console.log.

Проблема заключается в том, что RecordID не устанавливается в сохраненном документе.Документ сохраняется с правильными значениями, установленными в вызове save (), но не с RecordID, установленным в хуке предварительного сохранения.

Модель записей

async function getNextSequence(name) {

  let seq, result;

  try {
    result = await counters.findOneAndUpdate({
      _id: name
    }, {
      // Increment sequence by 1
      $inc: { seq: 1 }
    });
  }
  catch (error) {
    console.error(`getNextSequence failed ${error}`);
  }

  return result.seq;

}

// Pre save hook
RecordsSchema.pre('save', (next) => {
  // Get document being saved
  let record = this;

  // Get next RecordID auto increment number
  getNextSequence('RecordID').then(nextID => {
    // Set RecordID
    if (nextID) {
      record.RecordID = nextID;
    }
    // nextID is showing up correctly
    // record object also shows up correctly in the log,
    // but it does NOT show up in the database
    console.log(`RecordsSchema.pre ${nextID} ${JSON.stringify(record)}`);
    next();
  }).catch((error) => {
    console.error(`getNextSequence failed ${error}`);
  });

});

Запись вызова () вызов

router.post('/', (req, res, next) => {

  let record = new records();
    record.Title = req.body.Title;
    record.Location = req.body.Location;

  record.save().then(record => {
    res.status(200).json(record);
  }).catch((error) => {
    console.log(`${origin} ${error}`);
    res.status(500).send('Server error');
  });

});

Результат

Название и местоположение записи сохраняются правильно.Тем не менее, RecordID не сохраняется.Я также попытался с крюком сохранения сообщения, и та же самая проблема происходит.

RecordsSchema.post('save', (doc) => {
  // Get document being saved
  let record = doc;

  // Get next RecordID auto increment number
  getNextSequence('RecordID').then(nextID => {
    // Set RecordID
    if (nextID) {
      record.set( { RecordID: nextID } );
    }
    console.log(`RecordsSchema.post ${nextID} ${JSON.stringify(record)}`);
    //next();
  }).catch((error) => {
    console.error(`getNextSequence failed ${error}`);
  });

});

1 Ответ

0 голосов
/ 15 июня 2019

Я изменил функцию стрелки на выражение функции, чтобы решить эту проблему.Функция arrow не привязывается к ключевому слову this.В этом случае требуется функциональное выражение, поскольку хук сохранения Mongoose возвращает сохраняемый документ, связанный с ключевым словом this.

// Pre save hook
RecordsSchema.pre('save', function(next) {
  // Get document being saved
  let record = this;

  // Get next RecordID auto increment number
  getNextSequence('RecordID').then(nextID => {
    // Set RecordID
    if (nextID) {
      record.RecordID = nextID;
    }
    next();
  }).catch((error) => {
    console.error(`getNextSequence failed ${error}`);
  });

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...