GraphQL Apollo传递变量时ENUM类型被转为字符串如何解决
问题修复方案
GraphQL协议规定,通过变量传递Enum值时,就是以对应字符串字面量的形式传输的,只要你在Schema和Mutation的变量定义中明确了Enum类型,服务端会自动将符合格式的字符串解析为Enum实例,不需要做额外的格式转换。如果你收到了类型不匹配的报错,按以下步骤排查即可:
- 第一步:核对GraphQL Schema的输入类型定义
首先确保你定义了对应的Enum类型,且用户输入对象的title字段明确绑定该Enum类型,不要误写为String类型,示例Schema如下:
# 定义Enum枚举值 enum UserTitle { MR MRS MS DR } # 定义用户输入类型,title字段关联上面的枚举 input UserInput { first_name: String! last_name: String! title: UserTitle! } # Mutation定义要明确指定变量类型为上述输入类型数组 mutation sendUsers($users: [UserInput!]!) { sendUsers(users: $users) { # 此处写你需要的返回字段 } }
- 第二步:核对客户端变量的取值
你在代码中传入users数组时,每个对象的title取值必须和Schema中定义的Enum字面量完全一致,大小写、拼写都不能有偏差。
如果使用TypeScript,建议定义和Schema完全匹配的字符串枚举来避免拼写错误:
enum UserTitle { MR = "MR", MRS = "MRS", MS = "MS", DR = "DR" } // 构造users数组时直接引用枚举成员 const users = [{ first_name: "John", last_name: "Doe", title: UserTitle.MR }]
- 第三步:排查客户端序列化配置
如果以上两步都确认无误还是报错,检查两个配置点:
- 你的Apollo客户端链路是否加入了自定义的序列化中间件,错误地修改了Enum值的格式
- 如果使用了GraphQL Code Generator生成客户端类型,确保生成的输入类型中
title字段是Enum类型而非string类型
内容的提问来源于stack exchange,提问作者Bogdan Galata
相关产品推荐
相关产品推荐

