2015-07-17 2 views
17

Derzeit bin ich mit pre('save') Validierung zu tun:mongoose Unterschied zwischen Pre speichern und validieren? Wann benutzt man welchen?

UserSchema.pre('save', true, function(next, done) { 
    var self = this //in case inside a callback 
    var msg = helper.validation.user.username(self.username) 
    if (msg) { 
     self.invalidate('username', msg) 
     done(helper.getValidationError(msg)) 
    } 
    else 
     done() 
    next() 
}) 

Der Helfer-Modul verfügt über eine Funktion, die eine Eingabe und gibt Fehlermeldung akzeptiert.

exports.user = { 
    username: function(input) { 
     if (!input) 
      return 'username is required' 
     var min = 3 
     var max = 10 
     if (input.length < min) 
      return 'username min of length is ' + min 
     if (input.length > max) 
      return 'username max of length is ' + max 
     return null 
    } 
} 

Es gibt eine andere api validate ähnliche Dinge zu tun. Was ist der Unterschied zwischen ihnen und welchen sollte ich in welchen Fällen verwenden?

Antwort

8

Update:

Die Validierung, bevor der Benutzer definiert Haken durchgeführt wird. Sie können folgen this github post, wo der Beitragsleistende,

dies nicht implementieren. Die erste Validierung gibt uns die Möglichkeit, anzuhalten, bevor wir in benutzerdefinierten Hooks fortfahren, die asynchrone Updates für andere Sammlungen enthalten können.

Wenn wir die Validierung erneut ausführen müssen, nachdem wir eine Änderung von innen einen Haken haben, können wir immer manuell this.validate(next) ausführen.


Veraltet:

Ja, es gibt einen kleinen Unterschied, den ich kenne.

Pre-Haken werden vor der Validierung ausgeführt.

Es gibt ein geschlossenes Problem auf github, das um Bestätigung vor Pre-hooks, https://github.com/Automattic/mongoose/issues/400 bittet.


Und auch ein Grund gibt es für die Überprüfung nicht vor Pre Haken aufweist, angegeben in der gleichen Verbindung von @kamholz:

Angenommen, Sie haben zwei Felder, foo und fooSort, die beide erforderlich sind. fooSort ist eine tief verkürzte oder anderweitig transformierte Version von foo zur Verwendung in Sortierung. Da fooSort automatisch generiert werden kann, ist es sinnvoll, dies in einem Pre-Saves-Hook zu tun. Da die Validierung jedoch zuerst ausgeführt wird, schlägt sie fehl, bevor der Pre-Save-Hook ausgeführt wird, und hat die Möglichkeit, den fooSort-Wert auszufüllen. Es ist nicht möglich, die Validierung erneut manuell auszuführen.

Noch einmal, wenn Sie etwas validieren wollen und müssen dann den Haken für die Zeit nach validate:

UserSchema.post('validate', function(next){ 
    console.log("post validate called"); 
    next(); 
}); 


Also für Zusammenfassung, die einen Unterschied ich sehe ist,

  1. Sie können beide verwenden, solange Sie Eingaben erhalten, um direkt in db zu speichern, ohne etwas zu ändern (nur Validierung).

  2. Wenn Sie etwas zu verändern sind Sie vorge speichern Haken verwenden.

+0

Bitte bearbeiten Sie Ihre Antwort, da sie irreführend ist. Die geschlossene Ausgabe endet auf einer [Anmerkung] (https://github.com/Automattic/mongoose/issues/400#event-14349225), die vor dem vorge Haken laufen Validierer sollte, wie es der Fall ist, gerade jetzt. –

+0

@TalhaAwan .. Vielen Dank für die Meldung .. ich werde es bearbeiten –

3

Die obige Antwort ist falsch. Wenn Sie gehen zu: https://github.com/Automattic/mongoose/issues/400 und die Antworten zum Thema aus dem Mungo Beitrag lesen Sie werden sehen, dass er merkt sie, bevor absichtlich ausgeführt werden.

Das Thema heißt: Validierung sollte Lauf nach alle anderen vorge speichern Haken

Mongoose Beitrag aheckmann heißt es:

  • jetzt seine Lauf vor sie
  • dies nicht umsetzen. Validieren zuerst gibt uns eine Chance, vor dem Fortfahren in benutzerdefinierter Hooks zu stoppen, die asynchrone Updates zu anderen Sammlungen enthalten können.
Verwandte Themen