Я работаю над проектом, который объединяет несколько удаленных схем в службе шлюза и расширяет типы из этих схем. Это достигается с помощью 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. Это прекрасно сшивается, когда мне не нужно передавать какие-либо параметры фрагменту, как показано выше, но с тех пор я добавил аргумент фильтра типа DateRangeFilter
в commonCompetitorIds
. Расширение типа commonCompetitors
принимает этот фильтр в качестве аргумента, и мне нужно как-то передать его фрагменту, чтобы применить фильтр к commonCompetitorIds
. Я попробовал следующее ...
commonCompetitors: {
fragment: `fragment CommonCompetitorsFragment on VsStatistics { commonCompetitorIds(filter: $filter) }`
...
... в надежде, что родительские аргументы могут быть автоматически доступны фрагменту, но я получаю сообщение об ошибке Variable "$filter" is not defined
. Как я могу передать этот фильтр во фрагмент, чтобы получить отфильтрованный commonCompetitorIds
, который затем будет использоваться в преобразователе?