1. 后端
插件化手册
  • FH2 插件开发手册
    • 产品简介
    • 典型场景
    • 发版说明
    • 快速开始
      • 快速开始总览
      • 第一个插件
      • 后端插件
      • 全栈闭环
    • AI辅助开发
      • AI 开发 Skill
      • 安装与复验
      • 第一个工程
      • 真实需求示例:现场问题上报
      • 改造已有工程
      • 调试与交付
    • 开发指南
      • 开发指南
      • 基础概念
        • 基础概念总览
        • 什么是插件开发
        • 平台架构
        • 前端宿主、扩展点与能力
        • 后端运行时、入口与权限
        • 开发流程
        • 安全与隔离
        • 支持范围与问题反馈
      • 开发指南
        • 开发指南总览
        • 前端插件
          • 前端插件深度指南
          • 前端工程结构
          • 插件清单(fh2-plugin.json)
          • 入口与生命周期
          • 界面与状态
          • 多宿主插件
          • 跨宿主通信服务
          • HTTP、WebSocket 与事件
          • 存储、Blob 与定时器
          • 工具链与本地调试页面
        • 后端插件
          • 后端开发深度指南
          • 后端插件的结构
          • 后端源清单 fh2-plugin.json
          • HTTP 接口处理函数
          • 消息订阅与事件处理函数
          • ctx 与能力注入
          • 数据存储与缓存
          • 流程编排
          • 触发方式
          • 连接外部系统
          • 流程编排练习(DAG)
        • 前后端协作
          • 前后端协作总览
          • 前后端共享契约
          • 端到端幂等
          • 事件、通知与状态
          • 统一错误模型
          • 链路标识与诊断日志
        • 完整练习
          • 环境准备
          • 第一个前端插件
          • 第一个后端插件
          • 第一个全栈插件
      • 能力总览
        • 能力地图
        • 能力可用性矩阵
        • 前端能力
          • 平台通用能力
            • 平台通用能力总览
            • 基础运行时:HTTP、事件、WebSocket 与存储
            • 导航、位置与通知
            • 弹窗、音频与剪贴板
            • 地图能力
            • 项目设备能力
            • WPMZ 与航线预览
            • 受控对象上传
          • 项目宿主
            • 项目宿主总览
            • 项目上下文
            • 项目侧边栏入口
            • 项目插件路由
            • 项目工作区
          • 消息宿主
            • 消息宿主总览
            • 消息告警弹层
            • 消息导航与通知
          • 计划库宿主
            • 计划库宿主总览
            • 计划库表单上下文
            • 计划库表单扩展
            • 校验、提交与 `biz_ext`
          • 驾驶舱
            • 驾驶舱插件能力总览
            • 驾驶舱扩展点
            • 上下文与遥测
            • 相机、检测与 AI
            • 场景几何与直播指针
            • 飞控、云台与任务
            • 驾驶舱平台事件
        • 后端能力
          • 后端能力地图
          • 后端能力总览
          • 配置、受管出网与集成连接
          • 事件与流程
          • 飞行任务与违停巡逻
          • 数据存储
          • 媒体与前端通知
          • 资源租约
          • 作业、目标轨迹与视频处理
      • 调试与测试
        • 调试与测试总览
        • 快速入门排错
        • 本地开发
        • Web IDE:打开工程与保存改动
        • 工作流编辑器:节点、接线与交付
        • 知识与 MCP:先判断需要哪一层事实
        • 前端本地调试
        • 后端运行时与流程调试
        • 模拟数据与测试数据
        • 集成测试与 E2E
        • 日志与链路追踪
        • 常见问题排查
      • 完整示例
        • 示例与案例总览
        • 项目侧边栏与工作区
        • 消息告警卡片
        • 计划表单任务清单
        • 驾驶舱动作与左侧面板
        • 最小后端插件
        • 最小全栈插件
        • 多宿主插件实战
        • 事故快处
        • 交通抓拍
        • 违停巡逻完整案例
      • 构建发布与安全
        • 构建、发布与安全
        • 质量门禁
        • 行业包构建与打包
        • 能力版本发布
        • 安装、升级与回滚
        • 安全基线
      • API参考
        • API 参考总览
        • 前端
          • 前端 API 参考
          • 前端插件清单结构
          • 前端 SDK API
          • 前端扩展点目录
          • 前端能力目录
          • 前端平台事件目录
          • 跨宿主通信服务 API
          • 工具链命令行参考(`fh2-plugin`)
        • 后端
          • 后端 API 参考
          • 后端插件源清单
          • 后端 HTTP 接口参考
          • 后端事件消费参考
          • 后端脚本上下文(`ctx`)
          • 后端数据存储
          • 流程编排语言
          • 流程触发器参考
          • 后端能力目录
          • 后端 HTTP API
        • 共享契约
          • 共享契约参考
          • 类型与契约目录
          • 错误模型
          • 版本兼容性
      • 附录
        • 错误码
        • 术语表
        • 常见问题
  1. 后端

后端数据存储

store 是后端脚本读写业务数据的全局对象,数据存在插件自己的平台数据库表里。读取需申报 data:read,写入需申报 data:write(见能力目录)。

六个方法#

所有方法同步返回统一结果:{ok: true, data} | {ok: false, error: {code, message}}。
store.query(entity, filter, options)                   // → {list, total, limit, offset}
store.count(entity, filter)                            // → {count}
store.insert(entity, record)                           // → 新记录(id/createdAt/updatedAt + 业务字段;未给 id 自动生成)
store.createIfAbsent(entity, record, uniqueBy)         // → {created, record}  原子「有则取、无则建」
store.update(entity, filter, patch)                    // → {affected}
store.delete(entity, filter)                           // → {deleted}
query 是三参:第二参是筛选条件(字段算子对象),第三参是 {orderBy, limit, offset} 选项。
要点说明
orderBy必须是数组,如 [{field: 'createdAt', dir: 'desc'}];不指定按 id ASC,自定义排序末尾也会追加 id ASC 保证分页稳定
createIfAbsentuniqueBy 必填(字段名数组),数据库要有对应唯一索引——这是并发去重的标准做法
update / deletefilter 强制非空;affected === 0 是正常的并发未命中,不是错误
没有 put/get,也没有事务、表连接、聚合和裸 SQL。
写入值为字符串映射(StoreFields):布尔存 '1'/'0',毫秒时间戳存定宽 13 位字符串。

筛选条件写法(filter)#

const result = store.query('capture_record', {
  status: {eq: 'pending'},
  occurred_at_ms: [{gte: '1780000000000'}, {lte: '1780003600000'}],
}, {
  orderBy: [{field: 'occurred_at_ms', dir: 'desc'}],
  limit: 100,
})
操作符:eq、neq、gt、gte、lt、lte、in、nin、contains、startsWith、endsWith、isNull、isNotNull。字段之间、同字段多个条件都是 AND;没有 OR(对象式与数组式两种写法都接受)。
限制值
limit 默认 / 最大100 / 1000
offset 最大100000
条件数最大256
in / nin 最大项数1000
排序字段最大3

表结构与类型#

源码工程在后端成员根的 schema.sql 单点定义实体、字段与索引。源清单 fh2-plugin.json 不手写 entities;校验 / 构建从 SQL 派生实体声明,写入 dist/plugin.json。已有源清单包含 entities 时,当前工具不会合并或覆盖为 SQL 派生结果,不能维护两份声明并假设它们自动一致。
运行时读取的是构建产物里的 entities,不是临时解析 SQL。types/ 提供能力和上下文声明,不从 schema.sql 生成业务实体 TypeScript 类型;不手改生成清单或类型。
本地 dev 按有效实体声明模拟存储;目标环境的建表与索引须由发布流程执行 schema.sql。构建成功不代表建表完成;已声明的实体缺表或存储不可用时返回 STORAGE_ERROR。
store 使用逻辑实体名,返回记录中的平台字段是 id、createdAt、updatedAt;时间筛选和排序也用这些公开字段,不使用物理列名。业务写入按 StoreFields 传字符串,物理列类型以 schema.sql 为准;使用字符串保存毫秒时间戳时须定宽 13 位,避免字典序比较出错。

错误码#

UNKNOWN_ENTITY、UNKNOWN_FIELD、INVALID_FILTER、EMPTY_FILTER、TYPE_MISMATCH、DUPLICATE、LIMIT_EXCEEDED、STORAGE_ERROR、PERMISSION_DENIED。错误消息是净化后的固定文案,不含 SQL 和业务值。

边界与注意#

无事务:并发互斥用 createIfAbsent,或用 update 影响行数判断抢占结果。
调用存储前检查逻辑实体是否在当前插件的有效 entities 声明中;未声明实体返回 UNKNOWN_ENTITY,持有 data:* 不代表可访问任意表。业务字段的实际存在性仍由目标存储确认,不能把实体校验当成全部字段或多插件部署隔离已验证。

常见问题#

现象原因与处理
报 DUPLICATE唯一键冲突;用 createIfAbsent 表达「有则取」
报 UNKNOWN_ENTITY逻辑实体未进入当前插件的运行时声明;核对 schema.sql 和本次生成的 dist/plugin.json,不要手补生成字段
报 STORAGE_ERROR表没建(schema.sql 未执行)或数据库不可用
数字排序不对存成了不定长字符串;毫秒时间戳用定宽 13 位字符串
想一次写多张表并保证原子性不支持事务;把「要么都成功要么都不算」的判断改成 createIfAbsent + 补偿
修改于 2026-10-22 03:40:05
上一页
后端脚本上下文(`ctx`)
下一页
流程编排语言
Built with