Skip to content

标准化查询参数与跨库兼容实践

核心入口:app/repository/base/BaseStandardRepository.js_standardizeParams,以及 utils/EnhancedDataTransformer。作用:把业务层的 filters/populate/sort/pagination 转换为当前数据库可理解的查询格式,并保持结果结构一致。

TL;DR

  • _standardizeParams(payload, options) 会组合 filters/populate/sort/fields + 分页,先用 StandardParamsValidator 校验,再根据 databaseType 转换
  • MariaDB 模式会传入 sequelize 实例,支持 JSON 数组字段的 $in 查询(代码注释已说明)
  • _processResult 会把返回结果包装为统一格式,包含 docspageInfo(totalItems/pageSize/current/totalPage/searchkey)
  • 结合 _getDefaultPopulate/_getDefaultSearchKeys/_getDefaultSort 可在子类定制默认关联、搜索字段、排序

实操示例

js
class ArticleRepository extends BaseStandardRepository {
  constructor(ctx) {
    super(ctx, 'Content');
    this.registerModel({
      relations: {
        author: { path: 'author', select: ['userName', 'nickName'] },
        category: { path: 'category', select: ['cateName'] }
      }
    });
  }

  async list(payload = {}, options = {}) {
    const params = this._standardizeParams(payload, {
      filters: options.filters,
      populate: options.populate || this._getDefaultPopulate(),
      sort: options.sort || [{ field: 'updateDate', order: 'desc' }],
      fields: options.fields
    });

    const result = await this.adapter.find(params); // 交给具体数据库适配器
    return this._processResult(result, payload, options);
  }
}

设计细节

  • 参数校验StandardParamsValidator 会确保 filters/populate/sort/pagination 的格式正确,减少运行时错误。
  • 字段转换EnhancedDataTransformer.transformStandardParams 会根据模型关系、数据库类型调整字段名、ID 形态。
  • 分页信息保留:在 _processResult 中,如果原始结果包含 countdocs,会自动计算 totalPage 并透传 searchkey
  • 默认钩子:子类可重写 _getDefaultPopulate/_getDefaultSearchKeys/_getDefaultSort/_getDefaultAttributes,让常用查询无需重复传参。

常见问题 FAQ

  • populate 没生效?
    确认在 registerModel 里声明了 relations,并在 options.populate 指定 path/select;默认可通过 _getDefaultPopulate 提供。
  • 分页总数不对?
    需确保适配器返回 { docs, count }_processResult 会用 count 计算 totalPage;如果自定义查询,记得返回 count。
  • 字段命名不一致?
    使用 fieldsoptions.files,并让转换器根据数据库类型转换 ID/字段,避免 _id/id 混用。

最后更新于: