2015-11-25 3 views
3

Я хотел бы использовать крючок промежуточного программного обеспечения mongoose, чтобы повторить попытку сохранения документа в случае неудачного первоначального сохранения с дублирующейся ключевой ошибкой. Вариант использования выглядит следующим образом:Использовать кран mongoose для повторной попытки сохранения при повторной ошибке ключа

В моей модели используются пули для идентификации, которые автоматически генерируются. Например. item, item-2, item-3, ..., item-n. В случае, если item уже существует, счетчик должен быть добавлен в пул. Я не могу проверить «следующий» слизень заранее, так как мне нужно избегать конфликтов при любых обстоятельствах.

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

Возможно ли это вообще? Например. schema.post('save', handler) только выполняются при успешном сохранении. Есть ли другие крючки, которые я могу использовать?

ответ

0

я, наконец, пошел с раствором, используемого mongoose-uniqueslugs, который я адаптированный к нашим потребностям. Хотя этот вариант работает не только с pre/post hooks, он обеспечивает атомарность (т. Е. Не проверяет наличие доступных слизней заранее, а затем сохраняет, а просто повторяет попытку).

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

0

Я использую pre save hook, чтобы проверить, существует ли слизь уже со следующим кодом, и до сих пор он работает нормально.

pageSchema.pre('save', function(next){ 
    var page = this; 

    page.createdDT = new Date(); 
    page.updatedDT = new Date(); 

    page.slug = page.title.slug(); // create slug from title 

    var re = new RegExp(page.slug, 'i'); 

    mongoose.models["page"].find({slug: { $regex: re}}, function(err, pages){ 
     // slug doesn't exist, good to go 
     if(!err && !pages) return next(); 

     var slugs = []; 

     // let's get all slugs 
     pages.forEach(function(page){ 
      slugs.push(page.slug); 
     }); 

     // keep increasing `i` until slug is unique 
     // set i to 1 to avoid hello-0 
     var i = 1; 
     var tempSlug = page.slug; 
     while(slugs.indexOf(tempSlug) >= 0){ 
      tempSlug = page.slug + '-' + i; 
      i++; 
     } 

     //unique slug for example "hello-2" 
     page.slug = tempSlug; 
     next(); 
    }); 
}); 
+1

Благодарим за предложение. Потенциальная проблема с этим решением заключается в том, что проверка доступных слизней и сохранение нового документа не является атомарным. Честно говоря, это не проблема * огромная * в настоящее время, но я хотел избежать будущих ловушек с самого начала. – qqilihq

 Смежные вопросы

  • Нет связанных вопросов^_^