我有两个mongoose Schema,看起来像这样:
var FlowsSchema = new Schema({
name: {type: String, required: true},
description: {type: String},
active: {type: Boolean, default: false},
product: {type: Schema.ObjectId, ref: 'ClientProduct'},
type: {type: Schema.ObjectId, ref: 'ConversionType'},
});
然后将此架构嵌入到如下所示的父架构中:
var ClientCampaignSchema = new Schema({
name: {type: String, required: true},
description: {type: String},
active: {type: Boolean, default: false},
activeFrom: {type: Date},
activeUntil: {type: Date},
client: {type: Schema.ObjectId, ref: 'Client', required: true},
flows: [FlowsSchema]
});
和
var ConversionTypeSchema = new Schema({
name: {type: Schema.Types.Mixed, required: true},
requiresProductAssociation: {type: Boolean, default: false}
});
如您所见,我的FlowsSchema包含对ConversionType的引用。我想要做的只是允许将产品添加到流中,如果关联的conversiontype的'requiresProductAssociation'等于true。 不幸的是,我使用验证器或中间件,这意味着要调用mongoose.model('ConversionType'),它会自动异步并使事情变得混乱。怎么办?
P.S。如果有一种方法来存储对requiresProductAssociation boolean的引用,而不是整个对象那么好,因为我不再需要对该模型进行异步调用,但我不知道这是否可能。
答案 0 :(得分:1)
SchemaType#validate
的文档描述了如何对此类案例执行异步验证。异步验证器函数接收两个参数,第二个是您调用的回调函数,异步报告该值是否有效。
这使您可以将此验证实现为:
FlowsSchema.path('type').validate(function(value, respond) {
mongoose.model('ConversionType').findById(value, function(err, doc) {
respond(doc && doc.requiresProductAssociation);
});
});