在一个查询中汇编graphql查询,而无需重新编写解析程序或定义

时间:2018-05-02 05:04:22

标签: graphql apollo

我有3个graphql查询,它们调用3种不同的服务:

{
  individualQ{
    name
  }

  addressQ{
    address
  }

  contactQ{
    phone
  }
}

这3个查询中的每一个都有自己的解析器:

individualQ (root , args) {
    const individual_options = getOption(cfg.INDIVIDUAL_ENDPOINT);
    return axios(individual_options).then(res => res.data);
} ,
addressQ (root , args) {
    const address_options = getOption(cfg.ADDRESS_ENDPOINT);
    return axios(address_options).then(res => res.data);
} ,

contactQ (root , args) {
    const contact_Options = getOption(cfg.CONTACT_ENDPOINT);
    return axios(contact_Options).then(res => res.data);
}

实际上我想创建一个汇总三个查询的新查询。

我想找到一种方法如下:

personalInfo {
     individualQ{
        name
      }

      addressQ{
        address
      }

      contactQ{
        phone
      }
}

所以我的要求就是

{
   personalInfo 
}

1 个答案:

答案 0 :(得分:1)

如果您希望仅合并查询,则可以添加新类型和新查询。像这样:

# Type definitions
type PersonalInfo {
  individual: Individual
  address: Address
  contact: Contact
}

type Query {
  personalInfo: PersonalInfo
  # other queries
}

然后为这三个字段添加解析器:

const resolvers = {
  PersonalInfo: {
    individual (root , args) {
      const individual_options = getOption(cfg.INDIVIDUAL_ENDPOINT);
      return axios(individual_options).then(res => res.data);
    } ,
    address (root , args) {
      const address_options = getOption(cfg.ADDRESS_ENDPOINT);
      return axios(address_options).then(res => res.data);
    } ,
    contact (root , args) {
      const contact_Options = getOption(cfg.CONTACT_ENDPOINT);
      return axios(contact_Options).then(res => res.data);
    },
  },
  Query: {
    personalInfo: () => ({})
  },
}

我们为查询返回一个空对象,因为我们的字段解析器正在进行繁重的工作,但是我们仍然需要返回一个对象以便它们实际被触发(否则你将返回null查询)。

如果您想将任何内容传递给解析器(例如查询字段的参数),您可以根据需要通过返回的对象执行此操作。然后,该数据将作为传递给每个字段解析器的第一个参数(" root"值)。

附注:如果您正在寻找一种方法来发布没有选择子字段的GraphQL请求,那么这是不可能的 - 您总是必须准确地请求您想要的字段请求返回类型而不是标量的字段。