You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostGraphile中用字符串替代Enum排序失效,原生JS无枚举权限怎么解决?

解决PostGraphile原生JS排序问题

问题原因

  1. GraphQL枚举类型要求直接使用枚举值(不带引号),用字符串包裹会被识别为非枚举值,触发类型校验报错。
  2. 变量类型不匹配:你定义的$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 04:37:38