Apollo GraphQL 中带有变量的嵌套查询

Posted

技术标签:

【中文标题】Apollo GraphQL 中带有变量的嵌套查询【英文标题】:Nested query with variable in Apollo GraphQL 【发布时间】:2019-01-28 04:38:20 【问题描述】:

我正在使用 Apollo 服务器,尝试为电子商务应用程序构建嵌套查询。我正在查询一个休息 api 来检索购物篮中的物品。

但是,此请求的响应并未包含我们需要的所有产品信息。所以我试图嵌套一个额外的查询,使用返回的参数之一作为变量来获取所需的额外产品信息。

我看过嵌套查询示例,据我所知(我对 GraphQL 和 Apollo 很陌生),这是 GraphQL 的一大优点。但我还没有看到任何嵌套查询依赖于父查询返回值的示例。

//typeDefs
const typeDefs = gql`
    type Product 
        id: ID
        name: String
        sku: String
        length: Float
    
    type CartItem 
        id: ID
        product_id: ID
        quantity: Int
        product(product_id: ID!): Product
    
    type Query 
        getProduct(id: ID!): Product
        getCartItems(id: ID!): [CartItem]
    
`;
// resolvers
const processResponse = (resolved) => 
    try 
        const  data  = resolved;
        return data;
     catch (error) 
        return error;
    
;
const resolvers = 
    Query: 
        getProduct: async (parent,  id ,  ctx ) => 
            return processResponse(await ctx.get(`products/$id`));
        ,
        getCartItems: async (parent,  id ,  ctx ) => 
            return processResponse(await ctx.get(`carts/$id/items`))
        
    ,
    CartItem: 
        product: async (parent,  product_id ,  ctx ) => 
            return processRequest(await ctx.get(`products/$product_id`));
        
    
;

// and query in the playground
query 
  getCartItems(id:"1234b11") 
    id
    product_id
    quantity
    product(product_id: $product_id) 
      id
      name
      description
    
   

我得到的错误是 Variable \"$product_id\" is not defined." 当我用实际的 product_id 对 product_id 进行硬编码时,我得到了我想要的那种响应,但这当然不是动态的。我尝试将变量传递给查询,例如query ($product_id: ID),但我收到错误"Variable \"$product_id\" of type \"ID\" used in position expecting type \"String!\".",

任何帮助表示赞赏!

【问题讨论】:

【参考方案1】:

使用父参数解决了这个问题,并且没有将任何变量传递给子查询。

//typeDefs
type CartItem 
    id: ID
    product_id: ID
    quantity: Int
    product: Product

//resolver
getCartItems: async (parent,  id ,  ctx ) => 
    return processResponse(await ctx.get(`carts/$id/items`))
        ,
CartItem: 
    product: async (parent, args,  ctx ) => 
    const productId = parent.product_id;
    if (productId) 
      const  data  = processResponse(await ctx.get(`products/$productId`));
      return data
    

//query
query 
  getCartItems(id:"1234b11") 
    id
    product_id
    quantity
    product 
      id
      name
      description
    
   

【讨论】:

以上是关于Apollo GraphQL 中带有变量的嵌套查询的主要内容,如果未能解决你的问题,请参考以下文章

具有嵌套字段类型条件的 Apollo graphql 查询

Apollo GraphQL 客户端不会在查询中返回缓存的嵌套类型

Apollo/GraphQL:如何获取嵌套元素?

ReactJS/Javascript/Graphql/React-apollo:传递查询变量

Apollo/graphQL:如何将乐观 UI 用于嵌套反应组件的突变?

Apollo GraphQL 变量查询