изменение мангуста на pre ('update') не работает при проверке - PullRequest
0 голосов
/ 07 июня 2018

Мой код ниже содержит схему и промежуточное программное обеспечение pre ('update') для манипулирования свойством name схемы.На самом деле, я просто хочу добавить суффикс к свойству name, если значение уже существует в коллекции элементов.

const ItemSchema = mongoose.Schema({
  ...
  name : {type : String, required : true, unique : true, trim : true},
  ...
})

ItemSchema.pre("update", async function() {
  let name = this.getUpdate().$set.name;
  if (!name) return Promise.resolve();
  let count = await ItemModel.find({name}).count().exec();
  if(count>0) name = name + "_SOME_SUFFIX_BY_SOME_LOGIC";
  this.getUpdate().$set.name = name;
});

ItemSchema.plugin(require('mongoose-unique-validator'));

const ItemModel = mongoose.model('Item', ItemSchema);
module.exports = ItemModel;

, когда я затем пытаюсь обновить / пропатчить свойство name, кажется, что счетчик правильно получает значениеномер 1 и обновляет имя с помощью суффикса.После этого я корректно обновляю имя в объекте обновления на правильно манипулируемое имя (при этом имя с суффиксом наверняка не существует в коллекции)

, но теперь, когда я пытаюсь обновить, я получаю следующееОшибка:

Проверка не удалась: имя: Ошибка, ожидается, что name будет уникальным.Значение: `[name] _SOME_SUFFIX_BY_SOME_LOGIC '

Таким образом, он говорит мне, что новое суффиксное имя уже существует в базе данных, даже если оно не существует.

(я искал суффиксное имя внутри базы данных, но могу заверить, что его там нет, так как я запускаю его на тестовых коллекциях, пока не так много записей)

версия узла: 8.1.1 версия mongoose: 5.1.3 система: Ubuntu 16.04

1 Ответ

0 голосов
/ 08 июня 2018

Я на самом деле обнаружил, что проблема в mongoose-unique-validator.Я нашел комментарий в проблеме mongoose, объясняющий почему.

Поскольку mongoose-unique-validator использует асинхронные операции, такие как .count (), чтобы проверить, существует ли документ в базе данных, это возможно для двоих.Вызовы count () выполняются примерно одновременно, оба возвращают 0, а затем оба вставляют в MongoDB.Вам нужно выполнить некоторую операцию блокировки, чтобы она работала правильно в общем случае.

Единственный способ обойти это - использовать только один процесс и установить размер пула соединений mongodb равным 1, но этоограничивает количество серверов приложений, которые вы можете запустить, и будет работать только до тех пор, пока mongodb сохраняет свое прежнее поведение по блокировке операций для каждого соединения.

ссылка для выдачи

...