Core · 框架 · 数据库

查询输入与构造器

@nocobase/repository-input 提供可在前后端使用的查询输入契约。构造器将代码表达转换为可序列化数据,数据库执行和授权仍在服务端完成。

构造输入

TypeScript
import { buildFilter, buildSelect, buildSort } from '@nocobase/repository-input';

export const orderQuery = {
  filter: buildFilter((f) => f.string('status').eq('paid')),
  select: buildSelect((s) => s.fields('id', 'orderNo', 'amount')),
  sort: buildSort((s) => s.field('id').asc()),
};
const json = JSON.stringify(orderQuery);

buildFilter、buildSelect、buildSort、buildAggregate 接受对应 AST 或同步回调,返回独立的 JSON 快照。Filter 还支持简单等值对象。构造输入不连接数据库,也不验证调用方是否有权读取字段。

三种输入方式

方式适用位置
等值简写简单标量条件
Builder 回调开发代码中的可读组合
JSON AST保存、传输、动态生成

函数不能直接通过 JSON 传输,先用 build 工具物化。异步回调、循环对象、非法数字和不支持位置的函数会被拒绝;日期转 ISO 字符串,bigint 转十进制字符串。数值 Filter 的原生 bigint 仍不是合法 JSON 值。

变量与写入输入

context 为查询变量提供值,不是事务连接或权限对象。服务端决定哪些变量来自可信身份,哪些来自经校验的用户输入。

buildCreateValues 和 buildUpdateValues 物化写入构造器;完整远程 Repository 请求可使用 API Client 导出的 build*Options。不要使用供框架内部共享实现的 internal/* 入口。

服务端验证

保存的查询仍要核对 Collection、字段类型、关系深度、分页范围和授权策略。不能因为输入由官方 Builder 生成就允许任意数据访问。精确数值需要匹配字段能力,例如大整数和 DECIMAL 使用字符串保留精度。

测试可以比较 Builder 与 AST 的执行结果,但仅比较 JSON 形状不能验证数据库语义。相关主题:API Client、过滤与分页。

接口与实现

NocoBase 文档助手

关于 NocoBase,你想了解什么?

每次提问独立回答,不会参考之前的问答。请提供完整背景。