You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 09:50:32