全局 / 通用 Hook
全局 hook 是所有模型的 hook. 他们可以定义你想要的所有模型的行为,并且对插件特别有用. 它们可以用两种方式来定义,它们的语义略有不同:
默认 Hook (Sequelize.options.define)
const sequelize = new Sequelize(..., {
define: {
hooks: {
beforeCreate: () => {
// 做些什么
}
}
}
});
这将为所有模型添加一个默认 hook,如果模型没有定义自己的 beforeCreate
hook,那么它将运行.
class User extends Model {}
User.init({}, { sequelize });
class Project extends Model {}
Project.init({}, {
hooks: {
beforeCreate: () => {
// 做些其它什么
}
},
sequelize
});
User.create() // 运行全局 hook
Project.create() // 运行其自身的 hook (因为全局 hook 被覆盖)
常驻 Hook (Sequelize.addHook)
sequelize.addHook('beforeCreate', () => {
// 做些什么
});
这个 hook 总是在创建之前运行,无论模型是否指定了自己的 beforeCreate
hook.本地 hook 总是在全局 hook 之前运行::
class User extends Model {}
User.init({}, { sequelize });
class Project extends Model {}
Project.init({}, {
hooks: {
beforeCreate: () => {
// 做些其它什么
}
},
sequelize
});
User.create() // 运行全局 hook
Project.create() //运行其自己的 hook 之后运行全局 hook
本地 hook 总是在全局 hook 之前运行.
常驻 hook 也可以在 Sequelize.options
中定义:
new Sequelize(..., {
hooks: {
beforeCreate: () => {
// 做点什么
}
}
});
连接 Hook
Sequelize 提供了四个在获取或释放数据库连接之前和之后立即执行的 hook:
beforeConnect(config)
afterConnect(connection, config)
beforeDisconnect(connection)
afterDisconnect(connection)
如果需要异步获取数据库凭据,或者需要在创建后直接访问低级数据库连接,这些 hook 非常有用.
例如,我们可以从轮转令牌存储中异步获取数据库密码,并使用新凭据改变 Sequelize 的配置对象:
sequelize.beforeConnect((config) => {
return getAuthToken()
.then((token) => {
config.password = token;
});
});
这些 hook 只能 声明为永久全局挂钩,因为连接池由所有模型共享.