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

时间:2018-08-21 23:32:07

标签: graphql apollo-server

我正在使用Apollo服务器,试图为电子商务应用程序构造一个嵌套查询。我正在查询rest 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 个答案:

答案 0 :(得分:2)

使用父参数解决此问题,并且不将任何变量传递给子查询。

//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
    }
  } 
}