将查询参数从顶级传递到文件级

时间:2019-05-18 05:47:42

标签: graphql apollo apollo-server

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

userInfo (id: userId) {
   name
   email

   address {
      street
      country
   }
}

因此nameemail将由称为details的其余端点解析,但是address字段需要由另一个称为{{1 }}。 address休息端点还需要在address中传递userId(因为我的休息服务需要该字段)。我不确定,在这种情况下如何设计我的解析器?

出于同样的考虑,一个字段一旦解析就可以将数据发送到另一个字段吗?在grapqhql中可能吗?

2 个答案:

答案 0 :(得分:1)

在GraphQL中,每个字段都被称为“解析”为特定值。在GraphQL.js中,此值可以是解析程序返回的任何值,或者,如果解析程序返回的是Promise,则是Promise解析的任何值。此值是作为第一个参数向下传递到每个子字段的解析器的值。

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

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

async (parent, args, context, info) => {
  const { name, email } = await getDetails(args.id)
  return {
    name
    email
    id: args.id,
  }
}

即使您没有id字段,我们仍然可以将其包含在返回的对象中。这样,我们可以将一些其他信息(例如我们的参数)传递给任何子级字段的解析器。然后,在您的address解析器中:

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

答案 1 :(得分:0)

我要添加(在@daniel答案中),您可以在查询中明确传递此ID(无需更改address解析器)。

userInfo (id: userId) {
  name
  email

  address (userID: userId) {
    street
    country
  }
}

要使其(address解析器)通用,我们可以同时使用两个参数源:

async (parent, args, context, info) => {
  // `parent` (user) can contain `id` property
  return getAddress(args.userID ? args.userID : parent.id)
}

因为您应该可以只查询地址(对于给定的userId),而其余api则可以。