Zoeken op website

javascript - Hoe kan ik een variabele toevoegen aan een fragment bij het samenvoegen van schema's met Apollo GraphQL


Ik werk aan een project dat meerdere externe schema's samenvoegt in een gateway-service en types uit deze schema's uitbreidt. Dit wordt bereikt met mergeSchemas van graphql-tools, waarbij we vereiste fragmenten en aangepaste resolvers specificeren om door te verwijzen naar de relevante schema's. Een deel van deze implementatie is:

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 is een array van ID's die beschikbaar is op het VsStatistics-object. Dit werkt prima wanneer ik geen parameters aan het fragment hoef door te geven zoals hierboven weergegeven, maar sindsdien heb ik een filterargument van het type DateRangeFilter toegevoegd aan commonCompetitorIds. De type-extensie commonCompetitors neemt dit filter als argument en ik moet het op de een of andere manier aan het fragment doorgeven om het filter toe te passen op commonCompetitorIds. Ik heb het volgende geprobeerd...

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

...in de hoop dat de argumenten van de ouder automatisch beschikbaar zouden zijn voor het fragment, maar ik krijg een foutmelding waarin staat Variable "$filter" is not defined. Hoe kan ik dit filter doorgeven aan het fragment om de gefilterde commonCompetitorIds te krijgen die vervolgens in de resolver zullen worden gebruikt?

Antwoord #1

Er is een hernieuwde discussie over dit onderwerp in de GraphQL Tools-repo hier: https://github.com/ardatan/graphql-tools/discussions/1709. Kort gezegd, de basisfunctionaliteiten om deze functie te ondersteunen zijn toegevoegd in v6.0.15.

ORIGINEEL ANTWOORD:

Ik heb dit probleem omzeild door twee delegateToSchema-verzoeken te doen in mijn field resolver. De eerste haalt de gewone ID's op met variabele argumenten, en de tweede voert de standaard record stitching uit. Deze oplossing is minder dan ideaal omdat het een extra verzoek voor ID's toevoegt, wat ertoe leidt dat het stitching-verzoek uit fase raakt met andere batching die naar die service gaat. Hopelijk krijgen we in de toekomst native GraphQL Tools-ondersteuning.