如何用GraphQL和ApolloStack解决union / interface字段

我正在使用我的GraphQL实例的接口,但这个问题可能也适用于工会。 在所有实现接口的types中都有两个公共字段,但是每个types都有多个附加字段。

鉴于以下架构

interface FoodType { id: String type: String } type Pizza implements FoodType { id: String type: String pizzaType: String toppings: [String] size: String } type Salad implements FoodType { id: String type: String vegetarian: Boolean dressing: Boolean } type BasicFood implements FoodType { id: String type: String } 

和以下parsing器

 { Query: { GetAllFood(root) { return fetchFromAllFoodsEndpoint() .then((items) => { return mergeExtraFieldsByType(items); }); }, }, FoodType: { __resolveType(food) { switch (food.type) { case 'pizza': return 'Pizza'; case 'salad': return 'Salad'; default: return 'BasicFood'; } }, }, Pizza: { toppings({pizzaType}) { return fetchFromPizzaEndpoint(pizzaType); } } } 

我如何获得每种types的附加字段?

目前,我已经把所有的食物都取得了食物,以获得idtype的基本领域。 在此之后,我循环的结果,如果发现任何Pizzatypes,我打电话给fetchFromPizzaEndpoint ,获得额外的领域,并合并到原来的基本types。 我为每种types重复这一点。

我也可以手动parsing特定的字段,比如Pizza.toppings ,如上所示。

现在我的解决scheme是不理想的,我宁愿能够解决每个types的多个领域,就像我做单一的领域toppings 。 这可能与GraphQL? 有一个更好的方法来实现这一点,因为这是一个相当常见的用例。

理想情况下,我希望能够在我的parsing器中知道我的查询所要求的片段,因此我只能调用要求的端点(每个片段一个端点)。

 { Query: { GetAllFood(root) { return fetchFromAllFoodsEndpoint(); }, }, FoodType: { __resolveType(food) { switch (food.type) { case 'pizza': return 'Pizza'; case 'salad': return 'Salad'; default: return 'BasicFood'; } }, }, Pizza: { __resolveMissingFields(food) { return fetchFromPizzaEndpoint(food.id); } }, Salad: { __resolveMissingFields(food) { return fetchFromSaladEndpoint(food.id); } } } 

我知道这个问题是5个月大,但我希望这可以帮助其他人解决这个问题。 他正在通过他的解决scheme

 { Query: { GetAllFood(root) { return fetchFromAllFoodsEndpoint() .then((items) => { return mergeExtraFieldsByType(items); }); }, }, FoodType: { __resolveType(food) { switch (food.type) { case 'pizza': return 'Pizza'; case 'salad': return 'Salad'; default: return 'BasicFood'; } }, }, Pizza: { toppings({pizzaType}) { return fetchFromPizzaEndpoint(pizzaType); } } } 

但他真的想要的东西(不完全是,但我强调__resolveType相对于查询的位置)

 { Query: { GetAllFood(root) { return fetchFromAllFoodsEndpoint() .then((items) => { return mergeExtraFieldsByType(items); }); }, }, FoodType: { __resolveType(data, ctx, info) { return whatIsTheType(data, ctx, info) } } } 

官方文档在这里有一个例子,但它只包括接口types,我觉得很困惑。 我有一个额外的完整的可运行的联盟types的例子(configuration相同的接口) 在这里可用