SuperAPI AI 工具集

btst-backend-plugin-dev

编程与开发

查看项目

更新于 10-16 08:28

技能介绍

BTST 后端插件开发(btst-backend-plugin-dev)提供在 monorepo 内编写 BTST 后端插件时应遵循的模式与规则。

用途 该技能面向需要在 BTST 单体仓库中新增或维护后端插件的开发者,用于统一插件的目录组织、数据访问分层、业务操作定义、路由绑定与生命周期钩子命名,避免把校验、权限与生命周期逻辑散落到各处。

文件结构 插件位于 src/plugins/{name}/ 目录下,包含:

  • api/plugin.ts:defineBackendPlugin 入口。
  • api/getters.ts:只读数据库函数,不含 HTTP 上下文。
  • api/mutations.ts:更底层的写数据库函数。
  • api/operations.ts:经过校验的操作、权限事实与生命周期。
  • api/index.ts:重新导出 getters、mutations 与类型。
  • query-keys.ts:React Query key 工厂。

主要规则

  • getters.ts:只放纯异步数据库函数,不含 HTTP 上下文,不含生命周期钩子,始终以 adapter 作为第一个参数。
  • mutations.ts:只放底层写原语,不含 HTTP 上下文或生命周期组合;需注明调用方自行负责校验与生命周期。
  • api/index.ts:从 getters 与 mutations 重新导出全部内容,供服务端直接导入。
  • operations.ts:定义唯一维护的业务清单,包含输入校验、精确的权限描述符、权威事实、领域执行与生命周期钩子。
  • 将 HTTP 路由绑定到同名 operation;仅当真实路由名不匹配时才使用 operationRouteMap。
  • 可选的 raw 工厂范围很窄:一方插件只暴露 prefetchForRoute 用于 SSG。不要在 createBackendStack().raw 上重复业务 getters 或 mutations。
  • 请求工作使用 myStack.forRequest(request).operations.,显式受信任务使用 myStack.trusted.。

关键模式

  • 从 "@btst/stack/plugins/api" 导入 defineBackendPlugin 与 createEndpoint(不是 @btst/stack/plugins)。
  • 以 import type { DBAdapter as Adapter } from "@btst/db" 导入 adapter 类型。
  • 路由使用 createEndpoint(path, { method, query?, body? }, handler) 定义,而不是字符串键的 "GET /path" 对象。
  • 路由处理器直接返回数据(return item),没有 ctx.json()。
  • 使用 throw ctx.error(statusCode, { message }) 抛出错误。
  • routes 工厂返回具名对象:return { listItems, createItem } as const。
  • 导出路由类型为 ReturnType<ReturnType<typeof myBackendPlugin>["routes"]>。

生命周期钩子命名 命名模式为 onBefore{Action}{Entity}、onAfter{Action}{Entity}、onError{Action}{Entity},例如 onBeforeListPosts、onAfterListPosts、onErrorListPosts,以及 onBeforeCreatePost、onAfterCreatePost、onErrorCreatePost 等。应保留有意义的领域事件,而不是生造 CRUD 阶段,例如 onBeforeChat、onAfterChat、onErrorChat、onBeforeActivateTools。规范化名称时不要添加插件本身尚不支持的生命周期阶段。

AI 工具 execute 函数中的受信操作 myStack 是模块级常量。execute 闭包惰性执行(仅在 HTTP 请求时运行),因此到那时 myStack 一定已初始化。示例: import { createBackendStack } from "@btst/stack/api" export const myStack = createBackendStack({ ... }) const myTool = tool({ execute: async (params) => { await myStack.trusted.kanban.createTask({ title: params.title, columnId: "col-id", }) return { success: true } } })

常见错误

  • 导入路径错误:始终从 "@btst/stack/plugins/api" 导入,而不是 "@btst/stack/plugins"。
  • adapter 类型错误:在 getters、mutations、plugin 文件中使用 import type { DBAdapter as Adapter } from "@btst/db"。
  • 使用 "GET /path" 字符串键:路由应使用 createEndpoint(),而不是字符串键的 method/path 对象。
  • 使用 ctx.json():它不存在;应从路由处理器直接返回数据。
  • 在 createBackendStack().raw 上添加业务方法:不要这样做。通过 forRequest(request).operations 或 trusted 保持组合生命周期显式,raw 仅保留给范围较窄的底层或 SSG 辅助函数。
  • 在生命周期钩子中做授权:常规访问控制应放在 operation 描述符与唯一共享规则中;钩子接收的已是授权后的上下文。
  • 在 getters.ts 中写写操作:写函数应放在 mutations.ts,而不是 getters.ts。

完整代码模式 完整的 defineBackendPlugin、getters、mutations 与 api/index.ts 代码形态见 REFERENCE.md。

适用场景与限制 该技能适用于在 BTST monorepo 内开发后端插件的场景,尤其是需要统一数据访问分层、业务操作定义与生命周期钩子的项目。资料未提供该技能的收费、价格、平台支持范围或效果数据。