Apollo GraphQL中如何正确定义符合需求的枚举或Union类型GridSize
错误原因
- GraphQL 的 Union 类型仅支持联合多个对象类型,不能直接拼接字符串、数字等字面量值,也无法用来定义字段的可选值范围。你想要实现的「限定字段只能取固定枚举值」的需求,有两种符合规范的实现方案:
方案1:使用 Enum 类型(推荐)
Enum 是 GraphQL 原生支持的枚举类型,语法最简单,校验直接在 Schema 层自动生效,仅需要把数字值转成带标识的字符串枚举即可:
# sampleType.graphql enum GridSize { AUTO SIZE_1 SIZE_2 SIZE_3 SIZE_4 SIZE_5 SIZE_6 SIZE_7 SIZE_8 SIZE_9 SIZE_10 SIZE_11 SIZE_12 } type Element { xs: GridSize }
使用时前后端传递枚举值即可,如果你需要拿到数字值,在业务层做一次简单转换(比如把SIZE_1截取后半段转成数值)即可。
方案2:自定义标量类型(保留原数值格式)
如果你必须保留'auto'字符串和1-12数字的原始格式,就需要自定义标量,自己实现校验逻辑:
首先修改 Schema 文件:
# sampleType.graphql scalar GridSize type Element { xs: GridSize }
然后在 Apollo 服务端注册自定义标量的校验逻辑(以 Node.js 环境为例):
import { GraphQLScalarType, Kind } from 'graphql'; import { ApolloServer } from '@apollo/server'; const GridSizeScalar = new GraphQLScalarType({ name: 'GridSize', description: '网格尺寸,可选值为字符串 "auto" 或 1-12 区间的整数', // 校验返回给客户端的值 serialize(value) { if (value === 'auto' || (Number.isInteger(value) && value >= 1 && value <= 12)) { return value; } throw new Error('GridSize 仅允许为 "auto" 或 1-12 的整数'); }, // 校验客户端传递的变量值 parseValue(value) { if (value === 'auto' || (Number.isInteger(value) && value >= 1 && value <= 12)) { return value; } throw new Error('GridSize 仅允许为 "auto" 或 1-12 的整数'); }, // 校验硬编码在查询语句中的值 parseLiteral(ast) { if (ast.kind === Kind.STRING && ast.value === 'auto') { return 'auto'; } if (ast.kind === Kind.INT) { const num = parseInt(ast.value, 10); if (num >= 1 && num <= 12) return num; } throw new Error('GridSize 仅允许为 "auto" 或 1-12 的整数'); } }); // 在 ApolloServer 配置中注册标量 const server = new ApolloServer({ typeDefs, resolvers: { GridSize: GridSizeScalar, // 其他业务 resolver } });
内容的提问来源于stack exchange,提问作者bp123
相关产品推荐
相关产品推荐

