将获得的字段传递给GraphQL中的另一个查询

Ada*_*ski 7 graphql

想象一下以下查询:

query {
  user {
    id
  }
  SomeOtherStuff(id: <--- I want to pass the id obtained from user) {
    id
  }
}
Run Code Online (Sandbox Code Playgroud)

如何将从一个查询获得的参数传递给另一个查询?

Dan*_*den 5

在GraphQL中,将并行执行和解析请求的每个“级别”上的字段。在您的示例中,user并且SomeOtherStuff都是相同类型(根Query类型)的两个字段-因此将同时解析它们。这意味着每个查询本质上都不知道另一个查询或另一个查询解决了什么。

您将不得不处理这种情况的客户端。换句话说,首先请求用户,解析ID的响应,然后发出第二个请求。

编辑:在Apollo中,您将为此目的使用compose:

const userQuery = gql`query User { user { id } }`;
const stuffQuery = gql`query SomeOtherStuff($id: ID) { someOtherStuff(id: $id){ stuff } }`;

export default compose(
  graphql(userQuery, { name: 'userData' })
  graphql(stuffQuery, { name: 'stuffData', options: ({userData:{id}={}}) => ({variables: {id}}) }),
)(YourComponent)
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回复。这完全不是我对 GraphQL 的期望。我认为将多个请求合二为一的想法是 GraphQL 的主要原则。对我来说,这似乎是非常基本的场景,获取一些依赖于用户但不嵌套在用户本身中的其他数据......有什么方法可以获取依赖于用户而不嵌套在用户中的数据类型(在同一个请求中)? (7认同)
  • 简短的回答:没有。我敢说被迫处理你所描述的情况表明 API 设计很糟糕。关键是,如果有与用户相关的数据,它*应该*是用户类型的一部分。如果数据与当前登录的用户(查看者)相关,则可能应该有一个上下文感知查看器查询,让您无需先获取查看器的 ID 即可访问它。 (4认同)
  • 因为这个答案提到了 apollo,所以他们在这篇文章中提供了 3 个选项来处理这种情况:https://www.apollographql.com/blog/apollo-client/using-apollo-link-to-handle-dependent-queries/ (3认同)

kon*_*mer 5

我同意@DanielRearden。您应该制作类型解析器,以便您可以无限深入地了解图表。我在这里做了一个简单的服务器示例,显示了深厚的关系。因为所有名词字段都是引用,所以对于任何查询,它的深度都是无限的。

使用该服务器,您可以运行这样的查询,例如:

{
  hero {
    name
    friends {
      name
      friends {
        name
        friends {
          name
          friends: {
            name
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

所以,在你的例子中,结构如下:

query {
  user {
    id
    otherStuff {
      id
    }
  }
}
Run Code Online (Sandbox Code Playgroud)