2012-12-24 2 views
6

Ho schema User che ha un campo username. Vorrei che il campo fosse sensibile al maiuscolo/minuscolo, in modo che gli utenti possano registrare nomi come BobDylan. Tuttavia, ho bisogno del mio schema per convalidare le nuove voci per verificare che non vi siano duplicati, in quanto sensibili, come ad esempio bobdylan.Getter/setter mandrino per la normalizzazione dei dati

La mia ricerca mi ha insegnato che dovrei creare un campo aggiuntivo nello schema per memorizzare una versione minuscola/maiuscola, in modo da poter facilmente verificare se è unica. La mia domanda è, come potrei ottenere questo con l'API Mongoose?

Ho provato con una funzione set, come ad esempio:

UserSchema.path('username_lower_case').set(function(username_lower_case) { 
    return this.username.toLowerCase() 
}); 

Tuttavia, questa funzione non sembra essere in esecuzione. Fondamentalmente ho bisogno di dire a username_lower_case di essere quello che è username, ma in lettere minuscole.

risposta

10

Un modo sarebbe utilizzare un gancio di pre-salvataggio per farlo.

UserSchema.pre('save', function (next) { 
    this.username_lower_case = this.username && this.username.toLowerCase(); 
    next(); 
}); 

Un altro modo sarebbe quello di fare un username virtuale:

UserSchema.virtual('username').set(function (value) { 
    this.username_raw = value; 
    this.username_lower_case = value && value.toLowerCase(); 
}).get(function() { 
    return this.username_raw; 
}); 
+0

Grazie! Il pre-salvataggio avviene prima della convalida? –

+1

Non ne sono sicuro, ma penso che quando si chiama 'save', i ganci di validazione vengano eseguiti prima degli hook' pre-save'. Almeno, sarebbe più sensato. –