Mongoose pre.save()asynchronous中间件没有按预期工作

以下为: Mongoose唯一validation错误types

我使用这个模式从npm的mongoose 3.0.3

 var schema = new Schema({ _id: Schema.ObjectId, email: {type: String, required: true, unique: true} }); 

用这个中间件从unique:true获取一个validationError

 schema.pre("save", function(next, done) { var self = this; model.findOne({email : this.email}, 'email', function(err, results) { if(err) { done(err); } else if(results) { console.warn('results', results); self.invalidate("email", "email must be unique"); done(new Error("email must be unique")); } else { done(); } }); next(); }); 

但是,它不工作!

Users.create()仍然会返回一个MongoError: E11000 duplicate key error index ,而console.warn()只在这之后被调用。

保存操作不应该被调用,直到所有的中间件done()已经根据文档被调用,我应该得到一个validation错误。

它看起来像done()行为不按预期工作,

任何想法为什么?

您正在使用并行中间件callback函数(包含nextdone ),但是您没有在schema.pre参数中设置parallel标志,所以它使用的是串行规则。

所以要么在你的调用中包含并行标志:

 schema.pre("save", true, function(next, done) { ... 

或者切换到串行中间件callback风格,如果这只是你所需要的任何:

 schema.pre("save", function(next) { var self = this; model.findOne({email : this.email}, 'email', function(err, results) { if(err) { next(err); } else if(results) { console.warn('results', results); self.invalidate("email", "email must be unique"); next(new Error("email must be unique")); } else { next(); } }); });