GraphQL按start_time排序列表报sort未知参数错误如何解决
问题根因
报错的核心原因有两点:
- GraphQL是强类型协议,所有传入字段的参数必须提前在Schema中声明,你当前调用的
list_by_id字段本身没有定义sort入参,直接传入就会触发参数未知的校验错误。报错提示指向list.start_time是部分GraphQL引擎参数解析错位产生的误导信息,和start_time字段本身无关。 - 绝大多数GraphQL实现不会把排序参数挂在按ID查询的顶层字段上:如果
list_by_id是查询单个列表实体的字段,排序参数通常定义在实体内嵌的条目列表子字段上;如果list_by_id本身返回列表但无sort参数,说明该字段根本不支持服务端排序。
正确实现步骤
- 先确认Schema定义
打开GraphQL playground的文档面板,搜索list_by_id字段,查看它的入参列表、以及返回值结构下所有子字段的入参,找到真正支持排序配置的字段位置,同时确认排序参数的格式要求:- 部分实现排序参数是字符串格式,即你写的
"start_time:desc" - 部分实现是数组格式,例如
["start_time:desc"] - 部分实现是枚举对象格式,例如
order_by: {start_time: desc}
不要自行猜测参数名和传参格式,所有规则以Schema文档标注为准。
- 部分实现排序参数是字符串格式,即你写的
- 对应字段传参
举个最常见的场景:list_by_id返回单个列表实体,实体下的items字段是具体的可排序列表条目,正确查询写法如下:query GetListById($ListID: ID!) { list_by_id(id: $ListID) { id title items(sort: "start_time:desc") { id start_time end_time } } } - 兜底处理方案
如果排查后确认当前查询字段全链路都不支持服务端排序,直接拿到返回结果后在客户端做排序即可,以JavaScript为例:// 拿到接口返回数据后做本地降序 const sortedResult = [...data.list_by_id].sort((prev, curr) => { return new Date(curr.start_time).getTime() - new Date(prev.start_time).getTime() })
注意:只要字段没有在Schema中声明对应参数,不管参数逻辑是否合理,GraphQL都会直接拦截请求抛出错误,不要给未声明参数的字段强行传参。
内容的提问来源于stack exchange,提问作者Toufiqur Rahman
相关产品推荐
相关产品推荐

