提问者:小点点

从json api响应生成Graphql模式


我使用Apollo服务器2.0作为我的Restapis(不同的微服务)的graph ql聚合层。

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

例如如果我的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个答案

匿名用户

最后,经过大量的搜索和查找,我为自己写了一个脚本-

这有一些小问题,例如int被解析为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
}

匿名用户

这并不能真正回答你的问题,但我建议你不要这样做。GraphQL将自己定义为“毫无歉意的客户驱动”,这在我看来,你定义的每个查询都应该明确定义为客户特别想要的东西。如果你只有FLAT的数据,你不需要GraphQL,REST就足够了。如果你没有,你需要按照客户想要的方式仔细制作和专门嵌套数据,并对你的UI有意义。有很多工具可以让这变得更容易,但我建议不要满足你的要求。