标准化查询参数与跨库兼容实践
核心入口: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会把返回结果包装为统一格式,包含docs与pageInfo(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中,如果原始结果包含count与docs,会自动计算totalPage并透传searchkey。 - 默认钩子:子类可重写
_getDefaultPopulate/_getDefaultSearchKeys/_getDefaultSort/_getDefaultAttributes,让常用查询无需重复传参。
常见问题 FAQ
- populate 没生效?
确认在registerModel里声明了 relations,并在 options.populate 指定 path/select;默认可通过_getDefaultPopulate提供。 - 分页总数不对?
需确保适配器返回{ docs, count },_processResult会用count计算totalPage;如果自定义查询,记得返回 count。 - 字段命名不一致?
使用fields或options.files,并让转换器根据数据库类型转换 ID/字段,避免_id/id混用。