2012-11-27 5 views
19

Anknüpfend aus: Mongoose unique validation error typeMongoose pre.save() Asynchron-Middleware nicht wie erwartet funktioniert

Ich verwende dieses Schema mit mongoose 3.0.3 von npm:

var schema = new Schema({ 

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

}); 

Mit dieser Middleware eine validationerror zu erhalten aus unique: 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(); 
}); 

Es funktioniert jedoch nicht!

Users.create() wird immer noch eine a MongoError: E11000 duplicate key error index zurückgeben und die console.warn() wird nur danach aufgerufen.

Die Sicherungsaktion sollte nicht aufgerufen werden, bis alle Middleware done() entsprechend den Dokumenten aufgerufen worden sind, und ich sollte einen Überprüfungsfehler zurückbekommen.

Es sieht aus wie das done() Verhalten wird nicht wie erwartet funktioniert,

Jede Idee, warum?

Antwort

37

Sie verwenden eine parallel Middleware-Callback-Funktion (mit sowohl next und done), aber sie sind nicht die parallele Flag in den schema.pre Parametern einstellen, damit es die seriellen Regeln ist verwenden.

Also entweder sind die parallel Flagge in Ihren Anruf:

schema.pre("save", true, function(next, done) { ... 

Oder wechseln Sie zu einer seriellen Art Middleware-Rückrufs, wenn das alles ist, müssen Sie trotzdem:

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(); 
     } 
    }); 
}); 
+0

Welche Version von Mongoose gilt dies auf ? Ich kann keine Dokumente über diese parallele Signatur für 'schema.pre' finden, die Sie in Ihrem Code-Snippet verwenden. –

+1

@PeterLyons Die parallele Option war mindestens auf 2.x zurück. Siehe http://mongoosejs.com/docs/middleware.html für die Dokumentation. – JohnnyHK

+0

@JohnnyHK kann ich Statuscode in next() senden? Wenn ich die Anfrage ablehnen möchte, wird die Anfrage in der Datenbank nicht gespeichert und ein Statuscode gesendet? ist es möglich? – nirvair

Verwandte Themen