在 Sequelize 中进行 bulkCreating 时如何触发 beforeCreate 钩子?
How can I trigger the beforeCreate hook when bulkCreating in Sequelize?
我在 Sequelize 模型中有一个 beforeCreate
挂钩(对 User
table 中的密码运行 bcrypt),并想在种子文件中创建一个用户。像 bulkCreate 这样的函数只是简单地插入到数据库中,因此不会调用任何挂钩(包括 createdAt
/updatedAt
)。如何使用以与播种器所需格式匹配的方式调用的挂钩进行创建?
好像很多人都在用sequelize-fixtures
?这是要走的路吗?或者我可以忽略种子格式,并使用标准的 .create/.build 和 .save 格式?
此外,与播种相关的文档位于何处? Google 搜索在信息方面相当轻松。
批量创建时将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('a$') === 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);
});
}
我在 Sequelize 模型中有一个 beforeCreate
挂钩(对 User
table 中的密码运行 bcrypt),并想在种子文件中创建一个用户。像 bulkCreate 这样的函数只是简单地插入到数据库中,因此不会调用任何挂钩(包括 createdAt
/updatedAt
)。如何使用以与播种器所需格式匹配的方式调用的挂钩进行创建?
好像很多人都在用sequelize-fixtures
?这是要走的路吗?或者我可以忽略种子格式,并使用标准的 .create/.build 和 .save 格式?
此外,与播种相关的文档位于何处? Google 搜索在信息方面相当轻松。
批量创建时将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('a$') === 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);
});
}