对另一个模型的Mongoose异步调用使得验证无法进行

时间:2015-02-02 17:17:24

标签: node.js mongodb asynchronous express mongoose

我有两个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的引用,而不是整个对象那么好,因为我不再需要对该模型进行异步调用,但我不知道这是否可能。

1 个答案:

答案 0 :(得分:1)

SchemaType#validate的文档描述了如何对此类案例执行异步验证。异步验证器函数接收两个参数,第二个是您调用的回调函数,异步报告该值是否有效。

这使您可以将此验证实现为:

FlowsSchema.path('type').validate(function(value, respond) {
    mongoose.model('ConversionType').findById(value, function(err, doc) {
        respond(doc && doc.requiresProductAssociation);
    });
});