我正在编写一个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提取。
是否可以为每个客户设置品牌上下文,并且服务器可以接收此上下文?还是有更好的方法实现品牌分离?
答案 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级别上,一个品牌的对象永远无法引用另一个对象,并且,如果您拥有很多品牌,则需要一些好的方法来运行许多服务器。