GraphQL 接收有序排序参数列表的惯用实现方式是什么?
推荐的行业惯用方案:固定双字段排序输入对象列表
这是GraphQL生态中处理多字段排序最通用的标准实现,完全解决你提到的所有痛点。
实现方式
首先在Schema中定义3个基础类型:
- 排序字段枚举,限定所有支持排序的字段:
enum MonsterSortField { NAME BIRTHDATE ID }
- 排序方向枚举:
enum SortOrder { ASC DESC }
- 单个排序规则输入对象,固定两个字段,同时可以给排序方向设置默认值:
input MonsterSortInput { field: MonsterSortField! order: SortOrder = ASC }
最后在查询接口中声明排序参数,也可以直接给整个排序参数设置全局默认规则:
type Query { # 示例默认排序规则为按ID升序 monsters(sort: [MonsterSortInput!] = [{field: ID}]): [Monster!]! }
使用示例
用户传参的格式非常直观,数组顺序就是排序优先级:
- 按
name升序排序:sort: [{field: NAME}] - 按
name升序、birthdate降序、id升序排序:sort: [{field: NAME}, {field: BIRTHDATE, order: DESC}, {field: ID}]
方案优势
- 天然保证排序优先级:数组的顺序就是排序的执行顺序,完全不存在无序问题
- 原生强类型校验:GraphQL会自动校验参数格式,用户不可能写出多key的错误结构,不需要额外实现自定义校验逻辑
- 完美支持默认值:既可以给单个排序规则的排序方向设默认值,也可以给整个
sort参数设置全局默认排序规则,不会出现默认值污染的问题 - 扩展性强:后续新增排序字段只需要在
MonsterSortField枚举中加值即可,不需要调整整体参数结构
内容的提问来源于stack exchange,提问作者Nathan Long
相关产品推荐
相关产品推荐

