PostGraphile中用字符串替代Enum排序失效,原生JS无枚举权限怎么解决?
解决PostGraphile原生JS排序问题
问题原因
- GraphQL枚举类型要求直接使用枚举值(不带引号),用字符串包裹会被识别为非枚举值,触发类型校验报错。
- 变量类型不匹配:你定义的
$orderBy类型是[AwardInfosOrderBy!],但allAwards字段实际期望的是[AwardsOrderBy!]类型,导致类型校验失败。
解决方案
方案1:修正变量类型匹配GraphQL枚举
将查询中的变量类型改为allAwards对应的枚举类型[AwardsOrderBy!],变量值保持字符串数组形式即可:
query ($limit: Int!, $categoryId: Int, $orderBy: [AwardsOrderBy!]) { allAwards(first: $limit, orderBy: $orderBy) { edges { node { # 替换为你的实际字段 id date } } } }
变量示例:
{ "orderBy": ["DATE_DESC"], "limit": 10, "categoryId": 1 }
方案2:动态拼接查询字符串(适用于简单场景)
在原生JS中通过模板字符串直接将枚举值拼入查询(确保排序值来自可信来源或白名单,避免非法值):
// 定义合法排序值白名单,限制输入范围 const validOrderByValues = ["DATE_DESC", "DATE_ASC", "IMAGES_DESC"]; const selectedOrderBy = "DATE_DESC"; // 校验输入合法性 if (!validOrderByValues.includes(selectedOrderBy)) { throw new Error("Invalid orderBy value"); } // 动态生成查询 const query = ` query ($limit: Int!, $categoryId: Int) { allAwards(first: $limit, orderBy: ${selectedOrderBy}) { edges { node { id date } } } }`; // 执行查询(示例使用fetch) fetch("/graphql", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ query, variables: { limit: 10, categoryId: 1 } }) });
注意事项
- 可通过GraphQL playground查看
AwardsOrderBy枚举的所有可选值,确保排序值合法。 - 动态拼接查询时,必须校验输入值的合法性,避免注入非法枚举值导致查询报错。
内容的提问来源于stack exchange,提问作者Jamie Hutber
相关产品推荐
相关产品推荐

