全局 / 通用 Hook

全局 hook 是所有模型的 hook. 他们可以定义你想要的所有模型的行为,并且对插件特别有用. 它们可以用两种方式来定义,它们的语义略有不同:

默认 Hook (Sequelize.options.define)

  1. const sequelize = new Sequelize(..., {
  2. define: {
  3. hooks: {
  4. beforeCreate: () => {
  5. // 做些什么
  6. }
  7. }
  8. }
  9. });

这将为所有模型添加一个默认 hook,如果模型没有定义自己的 beforeCreate hook,那么它将运行.

  1. class User extends Model {}
  2. User.init({}, { sequelize });
  3. class Project extends Model {}
  4. Project.init({}, {
  5. hooks: {
  6. beforeCreate: () => {
  7. // 做些其它什么
  8. }
  9. },
  10. sequelize
  11. });
  12. User.create() // 运行全局 hook
  13. Project.create() // 运行其自身的 hook (因为全局 hook 被覆盖)

常驻 Hook (Sequelize.addHook)

  1. sequelize.addHook('beforeCreate', () => {
  2. // 做些什么
  3. });

这个 hook 总是在创建之前运行,无论模型是否指定了自己的 beforeCreate hook.本地 hook 总是在全局 hook 之前运行::

  1. class User extends Model {}
  2. User.init({}, { sequelize });
  3. class Project extends Model {}
  4. Project.init({}, {
  5. hooks: {
  6. beforeCreate: () => {
  7. // 做些其它什么
  8. }
  9. },
  10. sequelize
  11. });
  12. User.create() // 运行全局 hook
  13. Project.create() //运行其自己的 hook 之后运行全局 hook

本地 hook 总是在全局 hook 之前运行.

常驻 hook 也可以在 Sequelize.options 中定义:

  1. new Sequelize(..., {
  2. hooks: {
  3. beforeCreate: () => {
  4. // 做点什么
  5. }
  6. }
  7. });

连接 Hook

Sequelize 提供了四个在获取或释放数据库连接之前和之后立即执行的 hook:

  1. beforeConnect(config)
  2. afterConnect(connection, config)
  3. beforeDisconnect(connection)
  4. afterDisconnect(connection)

如果需要异步获取数据库凭据,或者需要在创建后直接访问低级数据库连接,这些 hook 非常有用.

例如,我们可以从轮转令牌存储中异步获取数据库密码,并使用新凭据改变 Sequelize 的配置对象:

  1. sequelize.beforeConnect((config) => {
  2. return getAuthToken()
  3. .then((token) => {
  4. config.password = token;
  5. });
  6. });

这些 hook 只能 声明为永久全局挂钩,因为连接池由所有模型共享.