如何用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的附加字段?
目前,我已经把所有的食物都取得了食物,以获得id
和type
的基本领域。 在此之后,我循环的结果,如果发现任何Pizza
types,我打电话给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相同的接口) 在这里可用