Mongoose pre.save() 异步中间件无法按预期工作



跟进自: 猫鼬唯一验证错误类型

我正在将此架构与来自 npm 的mongoose 3.0.3一起使用:

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

使用此中间件从 unique:true 获取验证错误

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()之前,不应调用保存操作,并且我应该返回验证错误。

看起来done()行为没有按预期工作,

知道为什么吗?

您正在使用并行中间件回调函数(同时具有nextdone),但您没有在schema.pre参数中设置并行标志,因此它使用串行规则。

因此,请在调用中包含并行标志:

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

或者切换到串行中间件回调样式,如果这就是您所需要的:

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();
}
});
});

最新更新