从 json api 响应生成 Graphql 模式

Wit*_*ult 5 schema graphql apollo-server

我在我的其余 api(不同的微服务)上使用Apollo server 2.0作为 graphql 聚合层。

我想直接从微服务的 api 响应生成graphql 模式,而不是手动编写它们,这可能容易出错。

例如,如果我的 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,
};
Run Code Online (Sandbox Code Playgroud)

然后我想根据提供的typeName生成以下模式,例如Person -

type Person {
  id: Float
  personName: String
  personShortName: String
  startDate: String
  endDate: String
  status: Float
}
Run Code Online (Sandbox Code Playgroud)

Wit*_*ult 3

最后,经过大量搜索和查找,我编写了一个脚本来为我做到这一点 -

这有一些小问题,例如整数被解析为浮点数,但这很好,因为如果需要,我可以用 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));
Run Code Online (Sandbox Code Playgroud)

它生成这样的输出 -

type Template {
  id: Float
  templateId: Float
  amount: Float
  amountINR: Float
  amountUSD: Float
  currencyCode: String
  createdAt: String
  createdBy: Float
}
Run Code Online (Sandbox Code Playgroud)