2012-11-27 9 views
19

Kontynuując od: Mongoose unique validation error typeMongoose pre.save() asynchroniczny middleware nie działa zgodnie z oczekiwaniami

Używam tego schematu z mongoose 3.0.3 z KMP:

var schema = new Schema({ 

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

}); 

Dzięki tej warstwy pośredniej, aby uzyskać validationError od unikalny: 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(); 
}); 

Jednak to nie działa!

Users.create() nadal będzie zwracać numer MongoError: E11000 duplicate key error index, a console.warn() jest wywoływany tylko po tym.

Czynność składowania nie powinna być wywoływana, dopóki nie zostanie wywołane wszystkie oprogramowanie warstwy pośredniej done() zgodnie z dokumentami, i powinienem otrzymać błąd sprawdzania poprawności.

Wygląda na to zachowanie done() nie działa zgodnie z oczekiwaniami,

jakiś pomysł, dlaczego?

Odpowiedz

37

Używasz funkcji wywołania zwrotnego równoległego oprogramowania pośredniego (zarówno z next, jak i done), ale nie ustawiasz flagi równoległej w parametrach schema.pre, więc używa ona reguł szeregowych.

Więc albo to równoległe flagę w swojej rozmowy:

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

lub przełączyć do seryjnego middleware zwrotnej stylu, czy to wszystko, co trzeba w każdym razie:

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

Jaka wersja Mongoose to się ma do ? Nie mogę znaleźć żadnych dokumentów dotyczących tego równoległego podpisu dla 'schema.pre', którego używasz w swoim fragmencie kodu. –

+1

@PeterLyons Opcja równoległa została zwrócona przynajmniej do 2.x. Zobacz dokument http://mongoosejs.com/docs/middleware.html dla dokumentów. – JohnnyHK

+0

@JohnnyHK czy mogę wysłać kod statusu w next()? Jeśli chcę odrzucić wniosek, to nie zapisać go w bazie danych i wysłać kod statusu? Czy to możliwe? – nirvair

Powiązane problemy