我使用Sequelize作为我的ORM。我想创建一个具有没有相关存储的属性的模型(即没有相应的表列)。这些属性可能包含getter和setter,也可能有验证。
如何在.save()
上创建不会存储到光盘的实例级属性?
情景
我有一个LocalLogins模型。我的模型有username
,salt
,盐渍password
和无保留rawPassword
。每次设置password
时,都会对该值进行加盐和散列。哈希的结果成为新密码。原始“原始”值将保存到rawPassword
。
我不想存储未加密的rawPassword
,但只要在调用.save()
时用于验证。这允许模型要求具有一定强度的密码。
尝试
我尝试将字段设置为''
,但遗憾的是没有效果。
var LocalLogin = sequelize.define('LocalLogin', {
username: {
allowNull: false,
field: 'username',
type: DataTypes.STRING,
},
password: {
allowNull: false,
field: 'password',
type: DataTypes.STRING,
},
rawPassword: {
field: '',
type: DataTypes.STRING
},
salt: {
allowNull: false,
defaultValue: function() {
var buf = crypto.randomBytes(32);
return buf.toString('hex');
},
field: 'salt',
type: DataTypes.STRING,
}
}, {
getterMethods: {
password: function() { return undefined; },
rawPassword: function() { return undefined; },
salt: function() { return undefined; }
},
setterMethods: {
password: function(val) {
// Salt and hash the password
this.setDataValue('rawPassword', val);
if(typeof val === 'string')
this.setDataValue('password', hash(val + this.getDataValue('selt')));
},
salt: function(val) {
// Salt cannot be modified
return null;
}
},
validate: {
passwordCheck: function() {
// Has a new password been set?
if(this.getDataValue('rawPassword') == null)
return
// Did they try to set the password as something other than a string?
if(typeof this.getDataValue('rawPassword') !== 'string')
throw new Error('Password must be a string');
// Make sure the password is long enough
if(this.getDataValue('rawPassword').length < 6)
throw new Error('Password must be longer than six characters.');
}
}
});
答案 0 :(得分:1)
DataType.VIRTUAL正是这样做的:http://docs.sequelizejs.com/en/latest/api/datatypes/#virtual