Подтвердить что ты не робот

Уникальный тип ошибки проверки 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).

Любая идея, почему?

4b9b3361

Ответ 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();
});