Graphql 将查询参数从顶级传递到字段级

Graphql 将查询参数从顶级传递到字段级,graphql,apollo,apollo-server,Graphql,Apollo,Apollo Server,我有一个如下所示的graphql查询: userInfo (id: userId) { name email address { street country } } 因此,名称和电子邮件将由一个名为details的rest端点解析,但是地址字段需要由另一个名为address的rest端点解析。AddressRESTEndpoint还需要在userInfo中传递用户ID,因为我的rest服务需要该字段。我不确定,在这种情况下如何设计解析器 同样

我有一个如下所示的graphql查询:

userInfo (id: userId) {
   name
   email

   address {
      street
      country
   }
}
因此,名称和电子邮件将由一个名为details的rest端点解析,但是地址字段需要由另一个名为address的rest端点解析。AddressRESTEndpoint还需要在userInfo中传递用户ID,因为我的rest服务需要该字段。我不确定,在这种情况下如何设计解析器


同样,一个字段一旦解析,是否可以将数据发送到另一个字段?这在grapqhql中可能吗

在GraphQL中,每个字段都被称为解析为特定值。在GraphQL.js中,该值是解析程序返回的任何值,或者,如果解析程序返回承诺,则是该承诺解析为的任何值。此值作为第一个参数传递给每个子字段的解析器

实际上,这意味着即使您的类型有特定的字段,并且您返回的对象应该与这些字段匹配,它也可以包含任意数量的附加属性

例如,您的userInfo解析器可以如下所示:

async (parent, args, context, info) => {
  const { name, email } = await getDetails(args.id)
  return {
    name
    email
    id: args.id,
  }
}
即使您没有id字段,我们仍然可以将其包含在返回的对象中。这样,我们可以将一些附加信息(如参数)向下传递给任何子字段的解析程序。然后,在地址解析程序中:

async (parent, args, context, info) => {
  // `parent` contains `name`, `email` and `id` properties
  return getAddress(parent.id)
}

我想在@daniel answer中添加一点,即您可以在查询中明确传递此id,而不需要地址解析程序更改

userInfo (id: userId) {
  name
  email

  address (userID: userId) {
    street
    country
  }
}
为了使地址解析器通用,我们可以使用两个参数源:

async (parent, args, context, info) => {
  // `parent` (user) can contain `id` property
  return getAddress(args.userID ? args.userID : parent.id)
}
因为您应该可以查询给定用户ID的唯一地址,就像RESTAPI一样