2015-07-17 5 views
17

Attualmente sto usando pre('save') di fare la convalida:La differenza di mangusta tra pre-salvare e convalidare? Quando usare quale?

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() 
}) 

Il modulo aiutante ha una funzione che accetta un input e restituisce il messaggio di errore.

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 
    } 
} 

C'è un'altra API validate per fare cose simili. Qual è la differenza tra loro e quale dovrei usare in quali casi?

risposta

8

Aggiornamento:

La convalida viene eseguita prima che i ganci definiti dall'utente. È possibile seguire this github post, dove gli stati del contributore,

non implementare questo. la convalida per prima ci dà la possibilità di interrompere prima di continuare in hook definiti dall'utente che possono includere aggiornamenti asincroni ad altre raccolte.

se è necessario eseguire nuovamente la convalida dopo aver apportato una modifica dall'interno di un hook, è sempre possibile eseguire manualmente this.validate(next).


obsolete:

Sì, c'è una piccola differenza lo so.

I pre-aggancio vengono eseguiti prima delle convalide.

C'è un problema chiuso su github che richiede la convalida prima dei pre-hook, https://github.com/Automattic/mongoose/issues/400.


e c'è anche un motivo per non avere convalida prima ganci pre, ha dichiarato lo stesso collegamento per @kamholz:

Diciamo che sono due campi, foo e fooSort, entrambi sono necessari. fooSort è una versione in maiuscolo o in altro modo trasformata di foo da utilizzare nell'ordinamento . Poichè fooSort può essere generato automaticamente, ha senso farlo in un gancio di pre-salvataggio. Tuttavia, poiché la convalida viene eseguita per prima, l'errore fallisce prima dell'esecuzione dell'hook di pre-salvataggio e ha la possibilità di completare il valore fooSort . Non è una questione di poter eseguire nuovamente la validazione manualmente.

Anche in questo caso, se si desidera convalidare qualcosa e poi hanno bisogno il gancio per il post validate:

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


Così, per sintesi, l'unica differenza che vedo è,

  1. puoi usare entrambi gli input per salvare direttamente in db senza alterare nulla (solo validazione).

  2. Se si modifica qualcosa, è necessario utilizzare il gancio di salvataggio.

+0

Si prega di modificare la risposta, in quanto è fuorviante. Il problema chiuso termina con una [nota] (https://github.com/Automattic/mongoose/issues/400#event-14349225) che i validatori devono eseguire prima dei pre-hook, come avviene ora. –

+0

@TalhaAwan .. grazie per avermi informato .. lo modificherò –

3

La risposta di cui sopra non è corretto. Se vai a: https://github.com/Automattic/mongoose/issues/400 e leggi le risposte all'argomento dal contributore di manguste vedrai che nota che vengono eseguite di proposito.

Il tema si chiama: convalida dovrebbe fuga dopo tutti gli altri pre-risparmiare ganci

Mongoose collaboratore afferma aheckmann che:

  • in questo momento la sua esecuzione prima loro
  • non implementare questo. convalidare prima ci dà la possibilità di fermarci prima di continuare in hook definiti dall'utente che possono includere aggiornamenti asincroni ad altre raccolte.
Problemi correlati