如何查询具有特定上下文的Apollo GraphQL服务器?

时间:2019-03-01 10:46:14

标签: graphql apollo

我正在编写一个Apollo GraphQL API,该API返回各种品牌的产品信息。模式的简化版本如下所示:

type Query {
  products: [Product]!
}

type Product {
  name: String!
  brand: String!
}

我希望能够查询特定品牌的产品。通常,通过向brand对象添加Product参数可以很容易地实现这一点:

type Query {
    products(brand: String!): [Product]!
}

但是,我在不同的应用程序中有多个GraphQL客户端,并且每个客户端都与一个特定品牌相关联,因此在每个查询中始终传递相同的brand参数似乎是多余的。我的架构中还有许多其他对象(订单,交易等),这些对象特定于品牌,并且需要一个brand参数。

此外,我的解析器需要根据品牌查询不同的API,因此,即使我的架构中的对象(例如User)在概念上与品牌无关,也可能需要brand参数,因此解析器知道要从哪个API提取。

是否可以为每个客户设置品牌上下文,并且服务器可以接收此上下文?还是有更好的方法实现品牌分离?

1 个答案:

答案 0 :(得分:0)

在您的GraphQL查询中,我可能会让Brand成为一流的类型。这并不能使您不必限定特定品牌描述的许多查询,但至少可以为您提供一个常见的起点。然后,您将获得类似于以下的API:

type Query {
  brand(name: String!): Brand
  allProducts: [Product!]!
}
type Brand {
  name: String!
  products: [Product!]!
  # users: [User!]!
}
type Product {
  name: String!
  brand: Brand! # typical, but not important to your question
}

如果在API层上可以看到各种品牌之间的差异,那么您也可以考虑使用GraphQL interface来描述所有品牌拥有的字段集,但实际上从解析器返回更具体的类型

以描述应用程序的方式,为每个品牌运行一个服务副本也很有意义,每个品牌都有一个不同的GraphQL端点。这样一来,您就可以直接参数化每个品牌的内部对象配置,并使“当前品牌”成为流程全局上下文。这里的主要限制是,在GraphQL级别上,一个品牌的对象永远无法引用另一个对象,并且,如果您拥有很多品牌,则需要一些好的方法来运行许多服务器。