【发布时间】:2020-01-19 04:10:33
【问题描述】:
我们正在实施 GraphQL 服务,该服务位于多个后端微服务的前面。
例如,我们有一个Product,每个产品都有一个历史订单列表。我们的后端服务器提供两个 REST API,一个用于产品详细数据,另一个返回产品的历史订单列表。
我们的客户端应用有两个页面:一个是产品详情页面,另一个是产品的历史订单列表。
所以,在商品详情页,我们只能获取商品的详情数据,而在订单列表页,我们只需要列表数据。
GraphQL 架构如下:
type ProductOrder {
createAt: Date!
userName: String!
count: Int
}
type Product {
productId: ID
name: String
orders: [ProductOrder!]!
}
Query {
product(productId: ID): Product
}
和解析器是这样的
const resolvers = {
Query: {
product(_, { productId}){
// fetch detail data from backend API
return await someService.getProductDetail(productId);
}
},
Product: {
orders(product){
// fetch order list from another API
return await someService.getProductOrders(product.productId);
}
}
};
但是我们使用上面的代码发现了一个潜在的过度请求。
当我们从订单列表页面请求订单列表数据时,我们必须先请求产品详情API,然后才能请求订单列表API。但我们仅需要订单列表数据,根本不需要产品数据。在这种情况下,我们认为产品详细信息请求没有用,我们如何消除这个请求?
如果我们可以只发送一个请求来检索订单列表数据,那会更好。
【问题讨论】:
标签: graphql graphql-js apollo-server express-graphql