Mongoose pre.save() 异步中间件未按预期工作
Posted
技术标签:
【中文标题】Mongoose pre.save() 异步中间件未按预期工作【英文标题】:Mongoose pre.save() async middleware not working as expected 【发布时间】:2012-11-14 23:50:04 【问题描述】:跟进来自:Mongoose unique validation error type
我将这个架构与来自 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()
之前,不应调用保存操作,我应该返回一个验证错误。
done()
的行为似乎没有按预期工作,
知道为什么吗?
【问题讨论】:
【参考方案1】:您正在使用并行中间件回调函数(next
和 done
),但您没有在 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();
);
);
【讨论】:
这适用于 Mongoose 的哪个版本?我找不到您在代码 sn-p 中使用的schema.pre
的此并行签名的任何文档。
@PeterLyons 并行选项至少回到了 2.x。有关文档,请参阅 mongoosejs.com/docs/middleware.html。
@JohnnyHK 我可以在 next() 中发送状态码吗?如果我想拒绝请求,那是不是将请求保存在数据库中,并发送状态码?有可能吗?以上是关于Mongoose pre.save() 异步中间件未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章
Mongoose 是不是提供对 pre('save') 中属性先前值的访问?
我希望我的 pre('save') mongoose 函数只运行一次