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

如何在GraphQL-JS中定义取值为1、2、3的枚举类型?

解决GraphQL-JS中定义只能取1、2、3的枚举问题

嘿,我来帮你搞定这个问题!你遇到的核心问题是GraphQL枚举类型的项名称必须是合法的标识符——简单说就是不能以数字开头,而且JavaScript对象里的数字键会被自动转成字符串,这就导致你原来的代码不符合GraphQL规范,所以运行不起来。

下面给你两种可行的解决方案,按需选择:

方案一:使用合法名称的枚举(推荐)

给每个枚举项起一个符合GraphQL规范的名称(比如以字母/下划线开头),然后把对应的value设为你需要的1、2、3。这样前端在查询时使用枚举名称,后端拿到的就是对应的数字值:

const AgeType = new GraphQLEnumType({
  name: 'Age',
  values: {
    AGE_1: { value: 1 },
    AGE_2: { value: 2 },
    AGE_3: { value: 3 }
  }
});

这种方式完全符合GraphQL的设计理念,枚举名称清晰易懂,还能让前端明确知道可选的取值范围。

方案二:自定义标量类型(允许直接输入数字)

如果你确实希望前端能直接输入数字1、2、3,而不是用枚举名称,那可以自定义一个标量类型,专门校验取值范围:

const AgeScalar = new GraphQLScalarType({
  name: 'Age',
  description: '只能取1、2、3的整数类型',
  // 序列化:把后端值转成返回给前端的格式
  serialize(value) {
    if (![1, 2, 3].includes(value)) {
      throw new Error('Age只能是1、2或3');
    }
    return value;
  },
  // 解析前端传入的变量值
  parseValue(value) {
    const num = parseInt(value, 10);
    if (![1, 2, 3].includes(num)) {
      throw new Error('Age只能是1、2或3');
    }
    return num;
  },
  // 解析GraphQL查询中的字面量
  parseLiteral(ast) {
    if (ast.kind !== 'IntValue') {
      throw new Error('Age必须是整数');
    }
    const num = parseInt(ast.value, 10);
    if (![1, 2, 3].includes(num)) {
      throw new Error('Age只能是1、2或3');
    }
    return num;
  }
});

这样用户在查询或变更时可以直接传入数字,系统会自动校验是否符合要求。

内容的提问来源于stack exchange,提问作者Hommer Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:23:34