定义GraphQL联合类型遇语法错误:Expected Name, found "["求助
解决GraphQL联合类型无法直接包含数组的问题
问题根源
GraphQL的联合类型(Union)规则明确:只能包含命名的类型(对象、接口、枚举),不能直接使用列表类型(比如[Room])。你写的RoomOrRooms = Room | [Rooms]违反了这个规则,所以才会报语法错误。
具体解决方案
1. 定义包装类型和合法的联合类型
先创建一个用来包装数组的对象类型,再基于它定义联合类型:
type Room { id: ID! name: String! # 其他Room字段... } # 包装数组的类型 type RoomList { rooms: [Room!]! } # 合法的联合类型:只能包含命名类型 union RoomOrRoomList = Room | RoomList
2. 在Apollo Server resolver中适配第三方API数据
在处理第三方API返回的resolver里,判断返回数据的类型,转换成对应的联合类型实例:
// 假设这是你的查询resolver const resolvers = { Query: { getRooms: async () => { const thirdPartyData = await fetchThirdPartyAPI(); // 判断返回的是单个对象还是数组 if (Array.isArray(thirdPartyData)) { // 返回RoomList类型的结构 return { __typename: 'RoomList', rooms: thirdPartyData }; } else { // 返回Room类型的结构 return { __typename: 'Room', ...thirdPartyData }; } }, }, // 联合类型的类型解析器(可选,但建议加上,帮助GraphQL准确识别类型) RoomOrRoomList: { __resolveType(obj) { if (obj.rooms) { return 'RoomList'; } return 'Room'; }, }, };
3. 客户端查询时处理联合类型
在Apollo Client的查询中,使用片段(fragment)分别处理两种类型的返回结果:
query GetRooms { getRooms { ... on Room { id name # Room类型的字段 } ... on RoomList { rooms { id name # Room类型的字段 } } } }
这样就能完美适配第三方API有时返回单个对象、有时返回数组的情况了。
内容的提问来源于stack exchange,提问作者Wesley Appleget
相关产品推荐
相关产品推荐

