我正在尝试在创建帐户后向列添加值,并且我希望从模型的实例方法执行此操作。我以典型的方式在服务中创建帐户,我想使用sequelize生成的用户id连接到另一个生成的id,该id也存储在每个用户的Users表中。我基本上想要在创建用户后调用实例方法,如下所示:
型号:
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);
});
}
答案 0 :(得分:1)
你可以用两种方式做到这一点
afterCreate
挂钩第一个选项非常舒适,因为每次创建新的模型实例时都会运行它,因此您不必记住每次要生成唯一ID时添加代码。
{
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);
});