Сшивание схемы в Apollo GraphQL не разрешает типы из других частей - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь сделать мою схему GraphQL компонуемой через схему сшивания , но я пытаюсь найти способ разрешить свойства типов из другой части.

Вот схема перед разложением:

type Referee {
  id: ID!
  stringProp: String!
}

type Referer {
  id: ID!
  pointer: Referee!
}

type Query {
  referers: [Referer]
}

Оба типа имеют средства разрешения в своих соответствующих схемах, которые расширяют объект { id } до { id, stringProp } или { id, pointer: { id } }, так что запрос

query FromSingleSchema {
  referers: {
    id
    pointer {
      id
      stringProp
    }
  }
}

разрешается как ожидалось; Query.referers разрешается в список [{id}] объектов, и каждый из них, в свою очередь, сначала разрешается в Referer, а затем извлекает Referee, на который указывает указатель, через распознаватели типов.

Теперь я пытаюсь разложить схему:

// schema A
type Referee {
  id: ID!
  stringProp: String!
}

// schema B
type Referer {
  id: ID!
}

type Query {
  referers: [Referer]
}

// schema Extensions
extend type Referer {
  pointer: Referee!
}

и составить его снова:

// both schemaA and schemaB have been created with makeExecutableSchema
import schemaA from './A'
import schemaB from './B'
// schemaExtensions is just a raw GraphQL string
// resolverExtensions is shown below
import { schemaExtensions, resolverExtensions } from './B'

const schema = mergeSchemas({
  schemas: [schemaA, schemaB, schemaExtensions],
  resolvers: Object.assign({}, resolverExtensions)
})

// resolverExtensions defined as follows:
{
  Referer: {
    pointer: {
      fragment: 'fragment IdFragment on Referee { id }',
      resolve: o => ({ id: o.pointerId })
    }
  }
}

С этим я могу выполнить этот запрос без проблем:

query OnlyIdFromDecomposedSchemas {
  referers: {
    id
    pointer {
      id
    }
  }
}

но это не удается

query FullRefereeFromDecomposedSchemas {
  referers: {
    id
    pointer {
      id
      stringProp
    }
  }
}

с сообщением об ошибке

Невозможно вернуть ноль для необнуляемого поля Referee.stringProp.

Что мне нужно сделать, чтобы преобразователь типа для Referee мог заполнить остальные свойства, как только { id } станет доступным, как это происходит в одной неразложенной схеме?

1 Ответ

0 голосов
/ 03 мая 2018

Я думаю, вы ищете делегирование схемы . Делегирование схемы - это способ автоматической пересылки запроса (или части запроса) из родительской схемы в другую схему (называемую подсхемой), которая может выполнить запрос.

Вы можете использовать delegateToSchema метод, подобный этому, в вашем преобразователе:

{
    Referer: {
      pointer : {
        resolve(parent, args, context, info) {
          return info.mergeInfo.delegateToSchema({
            schema: schemaA,
            operation: 'query',
            fieldName: 'referee', // modify according to your query for referee
            context,
            info,
          });
        }
      }
    }
  }
...