¿Cómo especifico un campo que se puede validar pero no almacenar en Waterline?
Pregunta
Estoy viendo el ejemplo en los documentos de Waterline. aquí.
var User = Waterline.Collection.extend({
types: {
// snip
password: function(password) {
return password === this.passwordConfirmation;
});
},
attributes: {
// snip
password: {
type: 'string',
password: true
},
passwordConfirmation: {
type: 'string'
}
}
});
¿Hay alguna manera de decirle a Waterline que passwordConfirmation
no forma parte del esquema, por lo que no se crea si migrar está configurado en alter
o drop
, ¿O si utiliza un motor de base de datos sin esquema?
El caso de uso real que quiero es un texto claro. password
campo para validar desde la solicitud, pero use beforeCreate
para poblar un hash
campo que realmente está almacenado (pero no permitiendo el password
propiedad que se almacenará en el proceso).
Gracias.
Solución
Waterline no admite campos transitorios que estén validados pero no persistan.Puedes agregar el schema: true
propiedad a su modelo, lo que hará que filtre cualquier atributo que no esté declarado explícitamente, pero aún así estará disponible en las devoluciones de llamadas del ciclo de vida.Tendrías que hacer la validación de esos atributos manualmente (en beforeCreate()
o beforeValidate()
por ejemplo), y perdería la capacidad de agregar campos arbitrarios a bases de datos sin esquema, pero no es necesariamente una mala solución.
Sin embargo, para su caso, no veo por qué es exactamente necesario.¿Por qué no simplemente codificar la contraseña? beforeCreate
y guardarlo de nuevo en password
?
beforeCreate: function (values, cb) {
values.password = hash(values.password);
return cb();
}