我在Sequelize模型中有一个beforeCreate
挂钩(在User
表中的密码上运行bcrypt),并且想在种子文件中创建一个用户。像bulkCreate这样的函数只是插入到数据库中,因此不要调用任何钩子(包括createdAt
/ updatedAt
)。如何使用与播种器所需格式匹配的方式调用钩子来创建?
似乎很多人只是使用sequelize-fixtures
?这是要走的路吗?或者我可以忽略种子格式,并使用标准的.create / .build和.save格式?
此外,有关播种的文件位于何处?谷歌的搜索信息非常清晰。
答案 0 :(得分:6)
在bulkCreating时将individualHooks
选项设置为true,如下所示:
User.bulkCreate(users, {individualHooks: true}).then(function() {
console.log("Done!");
});
有关此选项here的一些文档。
此外,如果您允许用户更改密码,则还应添加beforeUpdate
挂钩。您可以通过以下方式阻止密码被bcrypt处理两次(当更新密码以外的用户属性时):
function hashPassword(user, options, fn) {
//Don't hash if password is already hashed
if (user.dataValues.password.indexOf('$2a$') === 0) {
fn(null, user);
return;
}
bcrypt.hash(user.password, 10, function(err, hash) {
if (err) {
console.log('Error while generating hash!');
fn(err, null);
return;
}
user.password = hash;
fn(null, user);
});
}