Пост промежуточного ПО Mongoose / предварительные хуки для сохранения / обновления / удаления - PullRequest
0 голосов
/ 10 октября 2018

Я использую mongoose, и у меня есть две коллекции, которые ссылаются друг на друга.

const mongoose = require('mongoose');
const productVariantSchema = mongoose.Schema({
   _id:           mongoose.Schema.Types.ObjectId,
   name:         {type: String,  required: true},
   price:        {type: String,  required: true},
   reduced:      {type: Boolean, required: true},
   reducedPrice: {type: String,  required: false},
   manufacturer: {type: mongoose.Schema.Types.ObjectId, ref: 'Manufacturer', required: true},
   product:      {type: mongoose.Schema.Types.ObjectId, ref: 'Product', required: true}
});

module.exports = mongoose.model('ProductVariant', productVariantSchema);


const mongoose = require('mongoose');
const manufacturerSchema = mongoose.Schema({
   _id:               mongoose.Schema.Types.ObjectId,
   name:             {type: String,  required: true},
   street:           {type: String,  required: true},
   streetNumber:     {type: Number,  required: true},
   postcode:         {type: Number,  required: true},
   country:          {type: String,  required: true},
   productVariants: [{type: mongoose.Schema.Types.ObjectId, ref: 'ProductVariant', required: true}]
});

module.exports = mongoose.model('Manufacturer', manufacturerSchema);

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

productVariantSchema.pre('remove', function(next) {
    // Remove all the Manufacturer docs that reference the removed ProductVariant.
    this.model('Manufacturer').remove({ productVariant: this._id }, next);
});

productVariantSchema.post('save', function(doc) {
   this.model('Manufacturer').update({_id: doc.manufacturer}, {$push: {productVariants: doc._id}})
       .exec()
});

productVariantSchema.post('update', function(next) {
    this.model('Manufacturer').update({ productVariant: this._id }, next);
});

К сожалению, работает только ловушка pre ('remove', ...).

Когда я удаляю ProductVariant, который ссылается наизготовитель, запись удаляется в обеих коллекциях, как и должно быть.

Но это не относится к другим хукам.Когда я создаю новый ProductVariant, я хочу, чтобы он обновлял коллекцию Manufacturer, чтобы добавить запись в массив productVariants

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

Кажется, что перехват post ('update', ...) вообще не срабатывает, а перехват post ('save', ...) активируется, но почтальон выдает внутреннюю ошибку сервера, котораяне разработан.

РЕДАКТИРОВАТЬ

Я обновил хук сообщения («сохранить», ...), но я не уверен, является ли это законным способом достижения того, что янеобходимость.Я получаю схему производителя, обновляю ее, помещая недавно созданный ProductVariant в поле productVariants и выполняю ее.Однако я не могу отправить json после выполнения, потому что я получаю предупреждение об отклонении необработанного обещания, потому что я думаю, что не могу вернуть json, потому что я уже отправил json в обычной функции сохранения.Таким образом, для этого обновления нет никаких реальных проверок, но если бы я вставил неверные данные в схему, они уже были бы проверены и остановлены в обычной функции сохранения.

Более того, post ('update', ...), похоже, не поддерживается.Есть ли обходной путь для этого?

...