跳到主要内容

钩子

钩子

钩子为集合提供服务器端行为——校验与副作用——作为模型旁的一个文件,自动被发现,并带有生成的注册表感知类型。

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

操作BeforeAfter
create校验候选值、应用默认值、拒绝重复触碰派生数据、写入关联记录
update阻止禁止的转换、重新校验变更字段重算合计、更新搜索或派生状态
delete拒绝删除被引用或受保护的记录清理依赖产物、通知下游
持久工作属于自动化,不属于钩子
钩子属于别人写入的一部分:before 钩子在其事务之前运行,after 钩子在其提交之后运行。必须存活于写入之后的工作属于 自动化 ——定时、事件驱动或由代码通过 `api.automations.run` 启动,各自是一次持久化的后台运行。

选择最窄的角色

配套角色刻意重叠——选择最合适的一个:

  • 钩子 ——变更不变量与同事务副作用
  • 流水线 ——可复用的批量摄取与产物约定( 流水线
  • 集成 ——复用流水线的可靠外部投递( 集成