我正在使用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!\".",
。
任何帮助表示赞赏!
答案 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
}
}
}