在我的模型代码中,我使用钩子beforeCreate
对用户的密码进行加密。
在播种机中,我正在使用queryInterface.bulkInsert
创建10个用户。
据我了解,使用bulkInsert
时会绕过钩子。
我如何为10个用户播种数据库并使用像上面提到的钩子?
文件:seeders / 20180917155607-users.js
import faker from 'faker'
import lodash from 'lodash'
export default {
up: (queryInterface, Sequelize) => {
const res = lodash.times(10, () => ({
email: faker.internet.email(),
password: 'Password',
createdAt: new Date(),
updatedAt: new Date()
}))
return queryInterface.bulkInsert('users', res, {})
},
down: (queryInterface, Sequelize) => {
// do your stuff
}
}
文件:models / user.js
import bcrypt from 'bcrypt'
export default (sequelize, DataTypes) => {
const User = sequelize.define('user', {
email: {
type: DataTypes.STRING,
unique: true
},
password: DataTypes.STRING
})
User.beforeCreate(async user => {
user.password = await user.generatePasswordHash()
})
User.prototype.generatePasswordHash = async function() {
const saltRounds = 10
return await bcrypt.hash(this.password, saltRounds)
}
return User
}
答案 0 :(得分:1)
要使用bulkInsert()
/ bulkCreate()
运行挂钩,您需要传递individualHooks
选项(包括validate
来运行验证)。
queryInterface.bulkInsert('users', res, {
validate: true,
individualHooks: true,
});
答案 1 :(得分:0)
您的选择是: 1. queryInterface方法不使用模型,因此没有 钩子。 bulkInsert()是queryInterface方法。 2.模型方法bulkCreate是一个模型方法,将触发beforeBulkCreate钩子。如果您传递了personalHooks:true选项,它将为您触发beforeBulkCreate和beforeCreate挂钩。 3.文档说,bulkInsert具有与bulkCreate相同的选项,其中包括individualHooks和事务。查看model.js的代码表明,bulkCreate实际上通过返回builkInsert调用而起作用,因此它应该起作用。到目前为止,我还无法实现。