Sequelize 是一个基于 Promise 的 Node.js ORM 用于 Postgres, MySQL, MariaDB, SQLite 以及 Microsoft SQL Server 的支持。Sequelize 提供了钩子函数(Hooks)的特性,在执行数据库操作前和后通过定义的钩子函数注入逻辑,开发人员可以根据业务场景编写前置逻辑和后置逻辑。
什么是 Sequelize Hooks
Sequelize Hooks 是 Sequelize 提供的一个特性。它允许在执行 Sequelize 操作的不同阶段中,以注册的方式,添加要执行的自定义代码。Hooks 分为两大类,分别是前置函数和后置函数。
前置函数:
在操作执行前运行的函数。前置函数的执行可以被用于修改请求中的值或拦截请求。
后置函数:
在操作执行后运行的函数。后置函数的执行可以用于执行异步或线性请求。
Sequelize Hooks 的应用场景
开发人员在业务开发中经常需要实现许多增删改查操作及其相关的业务逻辑,比如:
- 社交场景下,用户注册时需要默认关注指定用户。
- 订单创建时,需要将商品库存减去购买量。
这些操作都需要在数据库操作前和后进行相关的业务逻辑操作,可以通过 Sequelize Hooks 实现。
Sequelize Hooks 的基本用法
定义模型与挂钩
// javascriptcn.com 代码示例 const Sequelize = require('sequelize'); const sequelize = new Sequelize('database', 'username', 'password', { dialect: 'mysql' }); const User = sequelize.define('user', { firstName: { type: Sequelize.STRING }, lastName: { type: Sequelize.STRING }, email: { type: Sequelize.STRING }, password: { type: Sequelize.STRING } }, { hooks: { beforeCreate: (user, options) => { const salt = bcrypt.genSaltSync(); user.password = bcrypt.hashSync(user.password, salt); }, beforeFind: (options) => { options.include.push({ model: Tag, attributes: ['id', 'name'], through: { attributes: [] } }); } } });
在示例代码中,定义了名为 User
的模型。定义实体属性,同时定义了 hooks。在 hooks 中,定义了两个钩子函数:
beforeCreate
:当创建一条新记录的时候,会先执行此函数。beforeFind
:当执行查询的时候,首先执行此函数。
Sequelize Hooks 的类型
- ValidationHooks
- AssociationHooks
- ModelHooks
- InstanceHooks
验证钩子
- beforeValidate
- afterValidate
- validationFailed
关联钩子
- beforeBulkAssociate
- afterBulkAssociate
- beforeAssociate
- afterAssociate
模型钩子
- beforeCreate
- afterCreate
- beforeDestroy
- afterDestroy
- beforeRestore
- afterRestore
- beforeUpdate
- afterUpdate
- beforeBulkCreate
- afterBulkCreate
- beforeBulkDestroy
- afterBulkDestroy
- beforeBulkRestore
- afterBulkRestore
- beforeBulkUpdate
- afterBulkUpdate
- beforeUpsert
- afterUpsert
实例钩子
- beforeSave
- afterSave
- beforeDestroy
- afterDestroy
Sequelize Hooks 的低版本兼容性处理
hooks 的命名在上面 Sequelize
's wiki 没有做太多声明,但是在使用的时候要注意:
- sequelize 5.x 及以上可以在 hooks 前加上 action;
- sequelize 4.x 及以下需要将 hooks 前的 action 去掉。
总结
Sequelize 作为广受欢迎的 ORM 库,在进行增删改查操作时都可以使用 Sequelize Hooks 的特性,方便实现对数据的前置处理、后置处理。
开发人员需要根据业务场景编写对应的前置逻辑和后置逻辑,使得业务逻辑清晰,易于维护。
同时,Hooks 的类型也需要开发人员熟悉,以便在使用时能够正确选择。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654c60a37d4982a6eb5eb5ad