播种对象时挂钩

时间:2018-09-22 14:09:34

标签: node.js express sequelize.js hook seeding

在我的模型代码中,我使用钩子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
}

2 个答案:

答案 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调用而起作用,因此它应该起作用。到目前为止,我还无法实现。