Wie gebe ich ein Feld an, das validiert, aber nicht in Waterline gespeichert werden kann?
Frage
Ich schaue mir das Beispiel in den Waterline-Dokumenten an hier.
var User = Waterline.Collection.extend({
types: {
// snip
password: function(password) {
return password === this.passwordConfirmation;
});
},
attributes: {
// snip
password: {
type: 'string',
password: true
},
passwordConfirmation: {
type: 'string'
}
}
});
Gibt es eine Möglichkeit, Waterline das mitzuteilen passwordConfirmation
ist nicht Teil des Schemas, sodass es nicht erstellt wird, wenn migrate auf festgelegt ist alter
oder drop
, oder wenn Sie eine schemalose DB-Engine verwenden?
Der eigentliche Anwendungsfall, den ich möchte, ist für einen Klartext password
feld, das aus der Anfrage validiert werden soll, aber verwenden Sie beforeCreate
um eine zu füllen hash
feld, das tatsächlich gespeichert ist (aber nicht zulässt, dass die password
eigenschaft, die im Prozess gespeichert werden soll).
Danke.
Lösung
Waterline unterstützt keine vorübergehenden Felder, die validiert, aber nicht persistent sind.Sie können das hinzufügen schema: true
eigenschaft für Ihr Modell, mit der alle Attribute herausgefiltert werden, die nicht explizit deklariert sind, aber dennoch in Lebenszyklus-Rückrufen verfügbar gemacht werden.Sie müssten die Validierung für diese Attribute manuell durchführen (in beforeCreate()
oder beforeValidate()
zum Beispiel), und Sie würden die Möglichkeit verlieren, schemalosen Datenbanken beliebige Felder hinzuzufügen, aber es ist nicht unbedingt eine schlechte Lösung.
Für Ihren Fall verstehe ich jedoch nicht, warum es genau notwendig ist.Warum nicht einfach das Passwort hashen beforeCreate
und speichere es zurück zu password
?
beforeCreate: function (values, cb) {
values.password = hash(values.password);
return cb();
}