Como especifico um campo que pode ser validado, mas não armazenado no Waterline?
Pergunta
Estou vendo o exemplo nos documentos Waterline aqui.
var User = Waterline.Collection.extend({
types: {
// snip
password: function(password) {
return password === this.passwordConfirmation;
});
},
attributes: {
// snip
password: {
type: 'string',
password: true
},
passwordConfirmation: {
type: 'string'
}
}
});
Existe uma maneira de dizer à Waterline que passwordConfirmation
não faz parte do esquema, portanto não será criado se a migração estiver definida como alter
ou drop
, ou se estiver usando um mecanismo de banco de dados sem esquema?
O caso de uso real que desejo é um texto não criptografado password
campo para validar a partir da solicitação, mas use beforeCreate
para povoar um hash
campo que está realmente armazenado (mas não permitindo o password
propriedade a ser armazenada no processo).
Obrigado.
Solução
Waterline não oferece suporte a campos transitórios que são validados, mas não persistidos.Você pode adicionar o schema: true
propriedade ao seu modelo, que fará com que ele filtre quaisquer atributos que não sejam explicitamente declarados, mas ainda os disponibilize em retornos de chamada do ciclo de vida.Você teria que fazer a validação desses atributos manualmente (em beforeCreate()
ou beforeValidate()
por exemplo) e você perderia a capacidade de adicionar campos arbitrários a bancos de dados sem esquema, mas isso não é necessariamente uma solução ruim.
Porém, para o seu caso, não vejo por que é exatamente necessário.Por que não apenas hash a senha beforeCreate
e salve-o de volta em password
?
beforeCreate: function (values, cb) {
values.password = hash(values.password);
return cb();
}