什么是 Hooks
Hooks 是 Sequelize 中的钩子函数,用于在执行一些异步动作(例如验证、保存等)之前或之后插入代码。这些函数在数据库操作之前或之后被执行,允许我们干预这些操作并根据需要做出更改。
Hooks 在 Sequelize 中很实用,可以极大程度地简化代码,并且可以很容易地创建自定义的验证方法和保存逻辑。
在 Sequelize 中有三类 Hooks:
- 在单个实例操作前/后执行的 Hooks
- 在给定的 model 的操作前/后执行的 Hooks
- 在 Sequelize 全局范围内执行的 Hooks
如何使用 Hooks
在单个实例上使用 Hooks
在一个实例上使用 Hook,通常应用于单个模型实例进行自定义逻辑,一般用于单个实例的验证和逻辑判断。
beforeValidate 和 afterValidate
下面是 beforeValidate 和 afterValidate Hooks 的使用说明:
-- -------------------- ---- ------- ----- ---- - ------------------------ - --------- - ----- ----------------- ---------- ------ ------- ---- -- --------- - ----- ----------------- ---------- ----- - -- - ------ - --------------- ------ -- - -- --- ---- ----- ---- ------------------- ---------- --- -- ------ -- -------------- ------ -- - -- --- ---- ----- ---- ------------------ ---------- --- -- ------ - - ---展开代码
beforeValidate 和 afterValidate 两个 Hooks 会在每次调用 validate() 方法时触发。beforeValidate 会在每次验证开始前执行,afterValidate 会在验证完成后执行。
beforeCreate 和 afterCreate
下面是 beforeCreate 和 afterCreate Hooks 的使用说明:
-- -------------------- ---- ------- ----- ---- - ------------------------ - --------- ----------------- --------- ---------------- --- ----------------------- ------ -------- -- - -- --- ---- ----- ---- ------------------- ------ --- -- ------ --- ---------------------- ------ -------- -- - -- --- ---- ----- ---- ------------------ ------ --- -- ------ ---展开代码
beforeCreate 和 afterCreate 两个 Hooks 会在每次创建实例之前和之后触发,可以修改实例属性,并设置 options.skip
跳过创建操作。
beforeDestroy 和 afterDestroy
下面是 beforeDestroy 和 afterDestroy Hooks 的使用说明:
-- -------------------- ---- ------- ------------------------ ------ -------- -- - -- --- ---- ----- ---- ------------------- ------- --- -- ------ --- ----------------------- ------ -------- -- - -- --- ---- ----- ---- ------------------ ------- --- -- ------ ---展开代码
beforeDestroy 和 afterDestroy 两个 Hooks 会在每次删除实例之前和之后触发。
在给定的 model 上使用 Hooks
在给定的 model 上使用 Hook,可以在它的所有实例中使用相同的逻辑。
beforeBulkCreate 和 afterBulkCreate
下面是 beforeBulkCreate 和 afterBulkCreate Hooks 的使用说明:
// Add some logic here Book.beforeBulkCreate(async (books, options) => { console.log('Before bulk create :>> ', books); }); Book.afterBulkCreate(async (books, options) => { console.log('After bulk create :>> ', books); });
beforeBulkCreate 和 afterBulkCreate 两个 Hooks 在执行一组 create
操作之前和之后分别运行一次。
beforeBulkUpdate 和 afterBulkUpdate
下面是 beforeBulkUpdate 和 afterBulkUpdate Hooks 的使用说明:
// Add some logic here Book.beforeBulkUpdate(async(options) => { console.log('Before bulk update :>> ', options); }); Book.afterBulkUpdate(async(options) => { console.log('After bulk update :>> ', options); });
beforeBulkUpdate 和 afterBulkUpdate 两个 Hooks 在执行 update
之前和之后分别运行一次,并可以用于更改实例的属性和 options
。
beforeBulkDestroy 和 afterBulkDestroy
下面是 beforeBulkDestroy 和 afterBulkDestroy Hooks 的使用说明:
// Add some logic here Book.beforeBulkDestroy(async(options) => { console.log('Before bulk destroy :>> ', options); }); Book.afterBulkDestroy(async(options) => { console.log('After bulk destroy :>> ', options); });
beforeBulkDestroy 和 afterBulkDestroy 两个 Hooks 在执行 destroy
之前和之后分别运行一次,并可以用于更改实例的属性和 options
。
在 Sequelize 全局范围内执行 Hooks
为了使用 Sequelize 全局范围内执行 Hooks,需要使用 addHook
函数将它们添加到 sequelize.Sequelize
实例上。
下面是 Sequelize 全局范围内使用 Hooks 的示例:
sequelize.addHook('beforeBulkCreate', async (options) => { console.log('Before bulk create :>> ', options); }); sequelize.addHook('afterBulkCreate', async (options) => { console.log('After bulk create :>> ', options); });
Hooks 的执行顺序
Hooks 的执行顺序是很重要的。在 Sequelize 中,执行 Hooks 的顺序是由他们的 Hook 名称决定的。例如,Hooks 执行的顺序可以由 Model 和实例属性列表中的各种 Hook 类型的名称来确定。
下面是 Hooks 的执行顺序:
- beforeCreate
- beforeUpdate
- beforeSave
- beforeValidate
- afterValidate
- validationFailed
- afterCreate
- afterUpdate
- afterSave
- afterDestroy
总结
Hooks 在 Sequelize 中非常有用,在编写应用程序时可以利用它们使代码更加具有逻辑性,并且可以极大程度减少出现问题的几率。在使用 Hooks 时,我们需要根据需求选择使用适当的 Hook 类型,并且了解 Hooks 的执行顺序对于解决问题也是非常重要的。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6472c1e4968c7c53b0058507