当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何使用GraphQL和ApolloStack解析union/interface字段》经验,为你挑选了1个好方法。

我正在使用我的GraphQL实例的接口,但这个问题也许适用于工会.实现接口的所有类型都有2个公共字段,但每种类型上都有多个附加字段.

给出以下架构

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
}

以及解决方案

{
  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);
    }
  }
}

如何获取每种类型的附加字段?

目前,我已在allFood获取所有的食物,以获得基本字段idtype.在此之后,我循环结果,如果找到任何类型的Pizza,我进行调用fetchFromPizzaEndpoint,获取其他字段并将它们合并到原始基本类型上.我为每种类型重复一遍.

我也能够手动解析特定字段,例如一个类型,Pizza.toppings如上所示.

现在我的解决方案并不理想,我宁愿能够为每种类型解析多个字段,就像我对单个字段一样toppings.GraphQL可以实现吗?必须有更好的方法来实现这一点,因为这是一个非常常见的用例.

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

{
  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);
    }
  }
}

小智.. 13

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

{
    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的位置)

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

官方文档在这里有一个例子,但它只包括接口类型,我发现这令人困惑.我有联盟类型可供额外的完整的可运行的例子(相同配置的接口)在这里



1> 小智..:

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

{
    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的位置)

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

官方文档在这里有一个例子,但它只包括接口类型,我发现这令人困惑.我有联盟类型可供额外的完整的可运行的例子(相同配置的接口)在这里

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有