Graphql - создание схемы из сгенерированного файла JSON - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь создать собственную схему graphql для использования на моем сервере йоги graphql.Сервер йоги graphql - это просто прокси для другого API-интерфейса graphql, из которого мне удалось получить схему в формате JSON.Вот предварительный просмотр того, как эта схема выглядит:

{
  "data": {
    "__schema": {
      "queryType": {
        "name": "Query"
      },
      "mutationType": null,
      "subscriptionType": null,
      "types": [
        {
          "kind": "OBJECT",
          "name": "Core",
          "description": null,
          "fields": [
            {
              "name": "_meta",
              "description": null,
              "args": [],
              "type": {
                "kind": "NON_NULL",
                "name": null,
                "ofType": {
                  "kind": "OBJECT",
                  "name": "Meta",
                  "ofType": null
                }
              },
              "isDeprecated": false,
              "deprecationReason": null
            },
            {
              "name": "_linkType",
              "description": null,
              "args": [],
              "type": {
                "kind": "SCALAR",
                "name": "String",
                "ofType": null
              },
              "isDeprecated": false,
              "deprecationReason": null
            }
          ],
          "inputFields": null,
          "interfaces": [
            { 

Теперь я хочу взять эту сгенерированную схему JSON и использовать ее для создания схемы graphql для использования на моем сервере йоги graphql.Я считаю, что правильный способ сделать это - использовать метод new GraphQLSchema из graphql вместе с корневым запросом.Вот мой код, который пытается это сделать:

schema = new GraphQLSchema({
  query: new GraphQLObjectType({
    name: 'Query',
    fields: schema.data.__schema
  })
});

Приведенный выше код дает мне следующую ошибку:

Ошибка: поле конфигурации Query.mutationType должно быть объектом

Не совсем уверен, в чем дело, или это правильный подход к созданию схемы graphql из сгенерированного JSON?

1 Ответ

0 голосов
/ 10 декабря 2018

JSON, который у вас есть, является результатом запроса самоанализа .К сожалению, самоанализ не позволит вам скопировать удаленную схему.Это потому, что, хотя он и определяет, какие поля существуют в схеме, он ничего не говорит вам о том, как они должны выполняться.Например, основываясь на опубликованном вами фрагменте, мы знаем, что удаленный сервер предоставляет запрос _meta, который возвращает тип Meta, но мы не знаем, какой код нужно выполнить для разрешения значения, возвращаемого запросом.

Технически, можно передать результаты запроса на самоанализ в buildClientSchema из модуля graphql/utilities.Однако схема не будет исполняемой, как указывают документы:

Учитывая результат, когда клиент выполняет запрос самоанализа, создает и возвращает экземпляр GraphQLSchema, который затем можно использовать со всеми GraphQL.js, но не могут использоваться для выполнения запроса, так как самоанализ не представляет функции «resolver», «parse» или «serialize» или любые другие внутренние механизмы сервера.

Если вы хотитечтобы создать прокси для другой конечной точки GraphQL, проще всего использовать makeRemoteExecutableSchema из graphql-tools.

Вот пример, основанный на документах :

import { HttpLink } from 'apollo-link-http';
import fetch from 'node-fetch';

const link = new HttpLink({ uri: 'http://your-endpoint-url/graphql', fetch });
async function getRemoteSchema () {
  const schema = await introspectSchema(link);
  return makeRemoteExecutableSchema({
    schema,
    link,
  });
}

Полученная схема представляет собой GraphQLSchema объект, который можно использовать как обычно:

import { GraphQLServer } from 'graphql-yoga'

async function startServer () {
  const schema = await introspectSchema(link);
  const executableSchema = makeRemoteExecutableSchema({
    schema,
    link,
  });
  const server = new GraphQLServer({ schema: executableSchema })
  server.start()
}

startServer()

graphql-tools также позволяет сшивать схемы вместе , если вы не только хотели использовать проксисуществующей конечной точки, но хотел бы добавить и к ней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...