与Apollo GraphQL合并架构时如何在片段中添加变量

时间:2019-10-08 18:43:46

标签: javascript typescript graphql apollo apollo-server

我正在研究一个项目,该项目将网关服务中的多个远程模式组合在一起,并从这些模式扩展类型。这是通过mergeSchemas中的graphql-tools实现的,我们在其中指定了所需的片段和自定义解析器以委托给相关架构。此实现的一部分是:

const typeExtensions = `
extend type VsStatistics {
  commonCompetitors(filter: DateRangeFilter): [Player!]!
}
`

const mergedSchema = mergeSchemas({
  schemas: [ playerSchema, resultsSchema, typeExtensions ],
  resolvers: {
    VsStatistics: {
      commonCompetitors: {
        fragment: `fragment CommonCompetitorsFragment on VsStatistics { commonCompetitorIds }`,
        resolve (parent, _args, context, info) {
          return info.mergeInfo.delegateToSchema({
            schema: playerSchema,
            operation: 'query',
            fieldName: 'players',
            args: { idArray: parent.commonCompetitorIds },
            context,
            info
          })
        }
      }
    }
  }
})

commonCompetitorIds是VsStatistics对象上可用的ID数组。如上所示,当我不需要将任何参数传递给片段时,此方法可以很好地工作,但是此后我向DateRangeFilter添加了类型为commonCompetitorIds的过滤器参数。 commonCompetitors类型扩展名将此过滤器作为参数,我需要以某种方式将其传递给片段,以便将过滤器应用于commonCompetitorIds。 我尝试了以下方法...

      commonCompetitors: {
        fragment: `fragment CommonCompetitorsFragment on VsStatistics { commonCompetitorIds(filter: $filter) }`
        ...

...希望该片段的父母参数可以自动使用,但是我得到一个错误,提示Variable "$filter" is not defined。我如何才能将此过滤器传递到片段中,以获取经过过滤的commonCompetitorIds,然后将其用于解析器?

1 个答案:

答案 0 :(得分:0)

这里的GraphQL工具仓库中有一个关于此主题的新讨论:https://github.com/ardatan/graphql-tools/discussions/1709。简而言之,在v6.0.15中添加了支持该功能的基本功能。

原始答案:

我通过设置两个来规避此问题 我的字段解析器中有delegateToSchema个请求。第一个 使用可变参数获取普通ID,第二个则获取 执行标准记录拼接。此解决方案小于 之所以理想,是因为它添加了一个额外的ID请求,该请求将 将拼接请求与其他批处理不同步 该服务。希望我们可以在中获得本机GraphQL工具支持 未来。