Apollo Server 2 Beta中枚举解析器报错问题求助
问题原因及解决办法
这个报错的核心原因是Apollo Server 2 Beta会自动根据你写的SDL(也就是gql标签里的Schema)生成枚举类型,不需要你手动在resolvers里创建GraphQLEnumType实例,你手动添加的枚举解析器反而和自动生成的类型产生了冲突。
具体来说:
- 当你在SDL里定义了
enum Travaux { ins val ech },Apollo Server会自动帮你生成对应的GraphQLEnumType,并把这个类型和Schema绑定。 - 你手动在resolvers里又创建了一个同名的
Travaux枚举类型,这就导致Apollo Server识别混乱——它发现resolvers里有一个Travaux,但这个实例和它从SDL生成的不是同一个,所以抛出了“Travaux.name was defined in resolvers, but enum is not in schema”的错误(本质是冲突,不是真的不在schema里)。
那如果想要给枚举值映射自定义的实际值(比如ins对应'en instruction'),正确的做法是在resolvers里直接给枚举类型设置键值对,不需要创建GraphQLEnumType,示例如下:
const resolvers = { // 其他解析器... Travaux: { ins: 'en instruction', val: 'valide', ech: 'échu' } }
这样既保留了SDL里的枚举结构定义,又能自定义枚举值的实际映射,还不会和Apollo自动生成的类型冲突。
内容的提问来源于stack exchange,提问作者François Romain
相关产品推荐
相关产品推荐

