mongoose独特的validation错误types
我使用这个模式从npm的mongoose 3.0.3
:
var schema = new Schema({ _id: Schema.ObjectId, email: {type: String, required: true, unique: true} });
如果我尝试保存已经在数据库中的电子邮件,我希望得到一个ValidationError
,如果省略了required
字段。 但是事实并非如此,我得到了一个MongoError: E11000 duplicate key error index
。
这不是一个validation错误(即使我删除了唯一的:true也会发生)。
任何想法为什么?
我更喜欢把它放在pathvalidation机制中,比如
UserSchema.path('email').validate(function(value, done) { this.model('User').count({ email: value }, function(err, count) { if (err) { return done(err); } // If `count` is greater than zero, "invalidate" done(!count); }); }, 'Email already exists');
然后它会被包装到ValidationError
并在调用validate
或save
时返回第一个参数。
这是预期的行为
unique: true
就相当于在mongodb中设置一个索引,如下所示:
db.myCollection.ensureIndex( { "email": 1 }, { unique: true } )
为了做这种使用Mongoose的validation(Mongoose称这个复杂的validation – 例如,你不只是断言该值是一个数字),你将需要连接到预保存事件:
mySchema.pre("save",function(next, done) { var self = this; mongoose.models["User"].findOne({email : self.email},function(err, results) { if(err) { done(err); } else if(results) { //there was a result found, so the email address exists self.invalidate("email","email must be unique"); done(new Error("email must be unique")); } else { done(); } }); next(); });