我正在尝试使用node-orm设置用户表,我想定义password
& passwordConfirmation
作为虚拟属性(即:未保存,仅用于验证和计算)以及encryptedPassword
,它实际上已保存到数据库中。据我所知,这似乎并未包含在包中。
作为一种解决方法,我正在尝试使用Object.defineProperties
,但我无处可去。这是我到目前为止所获得的相关代码。
var User = db.define('user', {
id : { type: 'serial', key: true },
email : { type: 'text', required: true, unique: true },
encryptedPassword : { type: 'text', required: true, mapsTo: 'encrypted_password' }
}, {
hooks: {
beforeValidation: function (next) {
this.encryptPassword(function (err, hash) {
if (err) return next(err);
this.encryptedPassword = hash;
next();
}.bind(this));
}
},
validations: {
password: [
orm.enforce.security.password('6', 'must be 6+ characters')
],
passwordConfirmation: [
orm.enforce.equalToProperty('password', 'does not match password')
]
},
methods: {
encryptPassword: function (callback) {
bcrypt.hash(this.password, config.server.salt, callback);
}
}
});
Object.defineProperties(User.prototype, {
password: {
writable: true,
enumerable: true
},
passwordConfirmation: {
writable: true,
enumerable: true
}
});
然后我尝试通过以下方式创建用户:
var params = require('params'); // https://github.com/vesln/params
app.post('/register', function (req, res, next) {
req.models.user.create([ userParams(req.body) ], function (err, users) {
// post-create logic here
});
});
function userParams(body) {
return params(body).only('email', 'password', 'passwordConfirmation');
};
我遇到的问题是调用bcrypt.hash
方法时,this.password
的值为undefined
,导致它抛出此错误:
{ [Error: data and salt arguments required]
index: 0,
instance:
{ id: [Getter/Setter],
email: [Getter/Setter],
encryptedPassword: [Getter/Setter] } }
似乎password
属性没有通过我的create
调用设置,所以我假设它是因为node-orm2没有传递自定义属性值,或者我已经定义了错误的属性(可能因为我之前没有真正使用过Object.defineProperties
)。
我做错了什么,和/或是否有其他方式可以做到这一点,我似乎无法在谷歌搜索中找到?谢谢!