钩子
钩子
钩子为集合提供服务器端行为——校验与副作用——作为模型旁的一个文件,自动被发现,并带有生成的注册表感知类型。
Before 与 After
创建 Before 钩子校验并返回被接受的输入(或对其进行修补);它们在写入之前运行,位于提交事务之外——拒绝时什么都不会写入。 After 钩子在写入提交后运行——审批挂起会将它们推迟到审批完成。
import { refuse } from '@norbital-ai/bolt/authoring';
import { Effect } from 'effect';
import type { Hooks } from './$types.js';
export default {
create: {
perRecord: {
before: {
description: 'Rejects a duplicate site name.',
handler: ({ input, api }) =>
Effect.gen(function* () {
const count = yield* api.db.query.sites.count({ where: { name: { eq: input.name } } });
if (count) refuse('Site already exists.');
return input;
})
}
}
}
} satisfies Hooks; 钩子点
钩子按操作声明。在 `create` 上,每个操作还可以携带 `prepare`(一次批量读取)与 `input`;逐记录钩子位于 perRecord :
| 操作 | Before | After |
|---|---|---|
create | 校验候选值、应用默认值、拒绝重复 | 触碰派生数据、写入关联记录 |
update | 阻止禁止的转换、重新校验变更字段 | 重算合计、更新搜索或派生状态 |
delete | 拒绝删除被引用或受保护的记录 | 清理依赖产物、通知下游 |
持久工作属于自动化,不属于钩子
钩子属于别人写入的一部分:before 钩子在其事务之前运行,after 钩子在其提交之后运行。必须存活于写入之后的工作属于 自动化 ——定时、事件驱动或由代码通过 `api.automations.run` 启动,各自是一次持久化的后台运行。
选择最窄的角色
配套角色刻意重叠——选择最合适的一个: