如何在将模式与 Apollo GraphQL 合并时将变量添加到片段中



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

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

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

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

。希望父母的参数可以自动用于片段,但我收到一个错误说Variable "$filter" is not defined.如何将此过滤器传递到片段中,以便获取过滤后的commonCompetitorIds,然后在解析器中使用?

在 GraphQL Tools 存储库中重新讨论了这个主题:https://github.com/ardatan/graphql-tools/discussions/1709。简而言之,在 v6.0.15 中添加了支持此功能的基本功能。

原答案:

我通过制作两个来规避这个问题delegateToSchema字段解析器中的请求。第一个 获取带有变量参数的纯 ID,第二个 执行标准记录拼接。此解决方案小于 理想,因为它添加了对 ID 的额外请求,该请求级联到 抛出拼接请求与其他批处理的相位 到该服务。希望我们能得到原生的 GraphQL Tools 支持 未来。

最新更新