用于保存/更新/删除的Mongoose中间件发布/预发布钩子

时间:2018-10-10 19:36:47

标签: node.js mongodb mongoose middleware

我正在使用猫鼬,并且我有两个相互引用的集合。

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',...)。有解决方法吗?

0 个答案:

没有答案