SuperAPI AI 工具集

queries

编程与开发

查看项目

更新于 10-15 21:41

技能介绍

用途:在 AdonisJS + Inertia 应用中组织只读查询逻辑。读操作放在 app/<mod>/queries/ 目录,不放在 services/(后者用于有副作用的行为)。类型定义在查询文件内部,前端通过 import type 消费,避免重复定义和单独的 types/ 文件。

两种形态,二选一,同一任务中不混用:

  1. 列表查询:用于分页 CRUD 表格(搜索、过滤、排序),返回 ModelPaginatorContract<Model>,用于资源索引页,参考 references/list-queries.md。
  2. 读模型:用于聚合型页面(仪表盘、报表),每个业务概念一个查询,由控制器用 Promise.all([...]) 组合,参考 references/read-models.md。

通用规则:

  • 位置:app/<mod>/queries/<verb>_<subject>.ts,例如 list_users.ts、get_revenue_metrics.ts。
  • 结构:默认导出一个类,含 async handle(input);input 为普通类型或接口,不使用 HttpContext。
  • 按业务概念拆分,不按组件(易碎片化)也不按页面(会把查询耦合到 UI)。
  • 前端通过 import type 从查询文件引入类型;类型导入在构建时被剥离,前端不会打包服务端代码。
  • 不要把原始 Lucid 实例直接返回给 Inertia:列表需经 Transformer 变体(见 [[crud]]),读模型返回普通对象结构。

文档参考:Lucid 分页 https://lucid.adonisjs.com/docs/pagination ;CQRS 读(Martin Fowler)https://martinfowler.com/bliki/CQRS.html ;CQRS 中的读模型 https://learn.microsoft.com/en-us/azure/architecture/patterns/cqrs 。

测试:直接对查询做单元测试,例如 await new ListInvoices().handle({...}),在 wrapInGlobalTransaction 内使用工厂填充数据库,见 [[testing]]。

相关技能:[[crud]]、[[inertia]]、[[actions-events]]、[[testing]]、[[authorization]]。

限制:资料未提供具体安装命令、版本要求、收费信息或完整代码示例。