通过sequelize.query()

时间:2018-11-20 04:15:36

标签: mysql node.js sequelize.js

对于MySQL数据库,我具有以下Employee模型:

var bcrypt = require('bcrypt');

module.exports = (sequelize, DataTypes) => {
    const Employee = sequelize.define(
        "Employee",
        {
            username: DataTypes.STRING,
            password: DataTypes.STRING,
        }, {}
    );
    return Employee;
};

通过raw queries读取包含10,000多名员工的.sql文件来完成数据库的播种:

sequelize.query(mySeedingSqlFileHere);

问题在于SQL文件中的密码是纯文本,我想在插入数据库之前使用bcrypt对它们进行哈希处理。我以前从未做过大容量插入,所以我一直在研究Sequelize docs for adding a hook to the Employee model,就像这样:

hooks: {
  beforeBulkCreate: (employees, options) => {
    for (employee in employees) {
      if (employee.password) {
        employee.password = await bcrypt.hash(employee.password, 10);
      }
     }
  }
}

这不起作用,因为在重新播种后我仍然获得纯文本值-我是否应该寻找另一种方法?我正在调查sequelize capitalize name before saving in database - instance hook

1 个答案:

答案 0 :(得分:1)

在使用模型的函数进行数据库操作之前,不会调用您的钩子,因此,如果您正在运行原始查询,则永远不会触发钩子,

  

原因:您可以在原始查询中编写任何内容,选择/插入/更新/删除任何内容,sequelize.js如何知道   它必须开钩。只有在使用方法时才有可能   像

Model.create();
Model.bulkCreate();
Model.update();
Model.destroy;
     

并且根据 DOC ,原始查询没有要添加的挂钩选项。   对于 MODEL 查询,您可以检查其是否具有   启用/禁用挂钩。