mysql - 通过 sequelize.query() 插入原始查询时不会触发 Hook

标签 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

最佳答案

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

Reason : You can write anything inside your raw query , select/insert/update/delete anything , how does sequelize.js know that it has to fire the hooks. This is only possible when you use methods like

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

And as per DOC raw query doesn't have hooks option to add. And for MODEL queries you can check that it has option to enable/disable hook.

关于mysql - 通过 sequelize.query() 插入原始查询时不会触发 Hook ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53386132/

相关文章:

python - 解析 JSON 文件中的数据并将其转换为 SQL 表

javascript - 如何等待执行findOne的sequelize

mysql - 为什么 SQL HAVING 条件中的 COUNT 没有计算出正确的值?

php - 如何将图像文件上传到现有数据库?

javascript - node.js 调用外部 exe 并等待输出

node.js - Mongoose - 如何将文档添加到具有该文档 ID 的数组中

javascript - Sequelize 和 Express 模型和关联设置

javascript - Node.js 代码仅在带有 Sequelize 的文件顶部工作

来自不同数据库的 Mysqldump 表?

javascript - 将本地 npm 库与 es6、babel 和 webpack 结合使用