当前位置: 首页 > 知识库问答 >
问题:

Apollo GraphQL中的变量嵌套查询

倪风史
2023-03-14

我正在使用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\”没有定义。“当我用实际的product_id硬编码product_id时,我得到了我想要的那种响应,但这当然不是动态的。我尝试向查询传递变量,比如query($product_id:ID),但我得到了一个错误”variable\“$product_id\”类型

任何帮助都很感激!


共有1个答案

舒俊雄
2023-03-14

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

//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
    }
  } 
}
 类似资料:
  • 问题内容: 我知道它看起来会令人费解,但是请帮助我了解发生了什么。 给出: 所以基本上,为什么我没有得到三种不同的动物?是不是“打包”到嵌套函数的局部作用域中?如果不是,对嵌套函数的调用如何查找局部变量? 我知道遇到这类问题通常意味着一个人“做错了”,但是我想了解会发生什么。 问题答案: 嵌套函数在执行时(而不是在定义时)从父范围中查找变量。 编译函数主体,然后验证“自由”变量(未在函数本身中通过

  • 问题内容: 假设我有以下python代码: 我想调用external()返回“字符串已被嵌套函数更改!”,但我得到了“”。我得出结论,Python认为该行是对inner()局部的新变量的声明。我的问题是:如何告诉Python应该使用external()字符串?我不能使用关键字,因为字符串不是全局的,它只存在于外部作用域中。有想法吗? 问题答案: 在Python 3.x中,可以使用关键字: 在Pyt

  • 问题内容: 我想使用ES进行图书搜索。因此,我决定将作者姓名和标题(作为嵌套文档)放入索引,如下所示: 我不明白的是:如何构造搜索查询,以便在搜索“一二”时仅找到第二本书,而在搜索“二三”时什么也找不到,而在搜索“一”时所有图书呢? 问题答案: 也许是这样的? 该查询基本上说一个文件必须有and 。您可以轻松地重新配置该查询。例如,如果您只想搜索作者,请删除嵌套部分。如果您想要另一本书,请更改嵌套

  • 问题内容: 我在获取与Elasticsearch一起使用的嵌套查询时遇到问题(如果我删除了查询字符串之一,则可以使用)。我要解决的问题是我有一个包含关闭列表的文档(关闭)。我想在条件满足另一个值的闭包列表中搜索一个值。那只是从argan = 1的闭包中获得价值 我正在得到这个错误响应; 我的映射如下所示。 有人知道我在做什么错吗? 问题答案: 您的查询不是有效的查询。您需要使用适当的复合查询将其他

  • 问题内容: 我有一个数据库,并且使用查询来生成一个中间表,如下所示: 我想为a <avg(a)的用户计算b的标准偏差 我以这种方式计算avg(a),并且效果很好: 但是查询: 返回一个错误,更准确地说,我被告知无法识别avg中的“ a”(选择a from …)。这使我感到非常困惑,因为它可以在上一个查询中使用。 如果有人可以帮助我,我将不胜感激。 编辑: 我将查询结果存储到临时表中以生成中间表,但

  • 问题内容: 这是我在elasticsearch中存储在索引上的数据类型。我必须找到包含主要成分牛肉(且重量小于1000)和成分-(辣椒粉且重量小于250),(橄榄油和重量小于300)以及所有其他成分类似的食谱。 索引的映射是 我的查询是 但这给了Null。有人可以帮我吗?我认为我没有正确使用嵌套查询 问题答案: 试试这个: