我正在尝试使用 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
调用该方法时, is 的值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
过)。
我做错了什么,和/或有另一种我在谷歌搜索中找不到的方法吗?谢谢!