如何在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
相关产品推荐
相关产品推荐

