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

Средство межпользовательского доступа Mongoose pre.save() не работает должным образом

Вслед за: Уникальный тип ошибки проверки Mongoose

Я использую эту схему с mongoose 3.0.3 от npm:

var schema = new Schema({

    _id: Schema.ObjectId,
    email: {type: String, required: true, unique: true}

});

С этим промежуточным программным обеспечением, чтобы получить validationError от уникального: 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() все равно вернет a MongoError: E11000 duplicate key error index, а console.warn() вызывается только после этого.

Действие сохранения не должно вызываться до тех пор, пока все связующее ПО done() не будут вызваны в соответствии с документами, и я должен вернуть ошибку проверки.

Похоже, что поведение done() работает не так, как ожидалось,

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

4b9b3361

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