Node.js Sequelize:是否有方法从实例方法更新值
我正在尝试在创建帐户后向列添加一个值,我想从模型的instance方法执行此操作。我正在以典型的方式在服务中创建帐户,我希望使用sequelize to concat生成的用户id来生成另一个生成的id,该id也与每个用户一起存储在users表中。我基本上希望在创建用户后调用instance方法,如下所示: 型号:Node.js Sequelize:是否有方法从实例方法更新值,node.js,express,sequelize.js,Node.js,Express,Sequelize.js,我正在尝试在创建帐户后向列添加一个值,我想从模型的instance方法执行此操作。我正在以典型的方式在服务中创建帐户,我希望使用sequelize to concat生成的用户id来生成另一个生成的id,该id也与每个用户一起存储在users表中。我基本上希望在创建用户后调用instance方法,如下所示: 型号: module.exports = function(sequelize) { let User = sequelize.define('User', { email:
module.exports = function(sequelize) {
let User = sequelize.define('User', {
email: ORM.STRING,
password: ORM.STRING,
accountVerified: {
type: ORM.INTEGER,
defaultValue: 0
}
},
{
classMethods: {
hashPassword: function(password) {
return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
}
},
instanceMethods: {
validatePassword: function(password) {
return bcrypt.compareSync(password, this.password);
},
uniqueId: function() {
let ch = this.id + sid.generate();
this.userId = this.id + sid.generate();
}
}
});
return User;
};
服务:
findOrCreate(email, password, done) {
let cachedEmail = email;
this.models.User
.findOrCreate({
where: { email: email },
defaults: {
password: this.models.User.hashPassword(password)
}
})
.spread(function(user, created) {
if (!created) {
return done(null, false, {
email: cachedEmail,
message: `Email ${cachedEmail} already exists.`
});
}
user.uniqueId();
done(null, user);
});
}
你可以用两种方法来做
- 使用创建新实例后立即运行的钩子
- 使用更新指定列值的实例方法
{
hooks: {
afterCreate: function(user, options){
let uniqueId = user.get('id') + sid.generate();
return user.set('userId', uniqueId).save().then((self) => {
return self;
});
}
}
}
上述代码只需在新创建的用户实例上执行UPDATE
另一方面,如果您想使用实例方法,它应该是这样的
{
instanceMethods: {
uniqueId: function() {
let uniqueId = this.get('id') + sid.generate();
return this.set('userId', uniqueId).save().then((self) => {
return self;
});
}
}
}
然后您可以将其作为普通实例方法调用,但它会返回一个承诺
userInstance.uniqueId().then((user) => {
// updated user
done(null, user);
}).catch(e => {
// handle error
done(e);
});
非常感谢。我使用生成UUID,因为我认为它更有效。然而,你的回答对我来说是一次很好的学习经历,我相信迟早会有一个用例出现。