Я использую 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', ...), похоже, не поддерживается.Есть ли обходной путь для этого?