Уникальный тип ошибки проверки Mongoose
Я использую эту схему с mongoose 3.0.3
от npm:
var schema = new Schema({
_id: Schema.ObjectId,
email: {type: String, required: true, unique: true}
});
Если я попытаюсь сохранить электронное письмо, которое уже находится в db, я ожидаю получить ValidationError
, как если бы поле required
было опущено. Однако это не так, я получаю MongoError: E11000 duplicate key error index
.
Это не ошибка проверки (происходит, даже если я удаляю unique: true).
Любая идея, почему?
Ответы
Ответ 1
Я предпочитаю помещать его в механизмы проверки пути, например
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
.
Ответ 2
Ожидаемое поведение
unique: true
эквивалентно установке индекса в mongodb следующим образом:
db.myCollection.ensureIndex( { "email": 1 }, { unique: true } )
Чтобы сделать этот тип проверки с помощью Mongoose (Mongoose называет эту сложную валидацию, т.е. вы не просто утверждаете, что это число, например, число), вам нужно будет подключиться к событию pre-save:
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();
});