我有以下用于 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/