Создать схему Graphql из ответа json api - PullRequest
0 голосов
/ 17 ноября 2018

Я использую Сервер Apollo 2.0 в качестве слоя агрегации graphql поверх моего остальных API (различные микроуслуги).

Я хочу сгенерировать схему graphql непосредственно из API-ответа микросервисов вместо того, чтобы вручную писать их вручную, что может привести к ошибкам.

Например, если мой ответ API

const restApiResponse = {
  "id": 512,
  "personName": "Caribbean T20 2016",
  "personShortName": "caribbean-t20 2016",
  "startDate": "2016-06-29T19:30:00.000Z",
  "endDate": "2016-08-08T18:29:59.000Z",
  "status": 0,
};

Затем я хочу создать схему ниже на основе typeName , предоставленного, например, Person -

type Person {
  id: Float
  personName: String
  personShortName: String
  startDate: String
  endDate: String
  status: Float
}

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Наконец, после большого количества поисков и поиска, я написал скрипт для этого -

Есть некоторые незначительные проблемы с этим, такие как целые числа анализируются как Floats, но это нормально, так как я могу заменить их наint, если требуется.

const { composeWithJson } = require('graphql-compose-json');
const { GQC } = require('graphql-compose');
const { printSchema } = require('graphql'); // CommonJS


const restApiResponse = {
    "id": 399,
    "templateId": 115,
    "amount": 100000,
    "amountINR": 100000,
    "amountUSD": 0,
    "currencyCode": "INR",
    "createdAt": "2018-06-07T00:08:28.000Z",
    "createdBy": 36,
};

const GqlType = composeWithJson('Template', restApiResponse);
const PersonGraphQLType = GqlType.getType();

GqlType.addResolver({
    name: 'findById',
    type: GqlType,
    args: {
      id: 'Int!',
    },
    resolve: rp => {
    },
  });

  GQC.rootQuery().addFields({
    person: GqlType.getResolver('findById'),
  });

const schema = GQC.buildSchema();

console.log(printSchema(schema));

Он генерирует вывод следующим образом -

type Template {
  id: Float
  templateId: Float
  amount: Float
  amountINR: Float
  amountUSD: Float
  currencyCode: String
  createdAt: String
  createdBy: Float
}
0 голосов
/ 19 ноября 2018

Это на самом деле не отвечает на ваш вопрос, но я бы порекомендовал вам НЕ делать этого. GraphQL определяет себя как «непозволительно управляемый клиентом», что подсказывает мне, что каждый определяемый вами запрос должен быть явно определен как то, что конкретно хочет клиент. Если у вас есть только FLAT-данные, вам не нужен GraphQL, а REST достаточно хорош. Если вы этого не сделаете, вам нужно будет тщательно обработать и специально вложить ваши данные так, как того хочет клиент, и имеет смысл для вашего пользовательского интерфейса. Есть много инструментов, чтобы сделать это проще, но я бы посоветовал против того, что вы просите.

...