我正在使用猫鼬,并且我有两个相互引用的集合。
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);
它们对应的路由和控制器按预期工作。我想实现前钩和后钩来更新引用的集合。我有3个用于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',...)钩子被激活,但是邮递员抛出了一个内部服务器错误。详细阐述。
编辑
我更新了post('save',...)钩子,但是我不确定这是否是实现我所需要的合法方法。我得到了制造商模式,通过将新创建的ProductVariant推入productVariants字段来对其进行更新并执行它。但是我无法在执行后发送json,因为我收到未处理的承诺拒绝警告,这是因为我认为我无法返回json,因为我已经在常规保存功能中发送了json。因此,此更新没有真正的验证方法,但是如果我将无效数据推入架构中,它将在正常保存功能中被检查并停止。
此外,似乎不支持post('update',...)。有解决方法吗?