首页 > 解决方案 > 在一个查询中组装 graphql 查询,而无需重新编写解析器或定义

问题描述

我有 3 个调用 3 个不同服务的 graphql 查询:

{
  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 
}

标签: graphqlapollo

解决方案


如果您只想合并查询,则可以添加新类型和新查询。像这样的东西:

# 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查询)。

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

旁注:如果您正在寻找一种在不选择子字段的情况下发出 GraphQL 请求的方法,那将是不可能的——在请求返回类型而不是返回类型的字段时,您始终必须准确请求所需的字段一个标量。


推荐阅读