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函数(包含next
和done
),但是您没有在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(); } }); });