在Nodejs中以GraphQL类型分配JSON

时间:2017-10-25 07:53:51

标签: javascript json node.js graphql

我正在使用Nodejs调用报告API,它给了我一个JSON响应。可以使用不同的ID调用api(在这种情况下,不同的报告ID)。例如:

  https://report.domain.io/report/1
  https://report.domain.io/report/2

等等。由于id在不同的时间不同,它会给我不同的回答。属性名称将不同。所以我无法将它映射到GraphQLObjectType中。例如,如果JSON响应如下:

[
    {
        "modelbrand": "Sony",
        "modelcode": "F3111",
        "avg_free_storage": 225401514
    },
    {
        "modelbrand": "Sony",
        "modelcode": "F3111",
        "avg_free_storage": 224547840
    }
]

然后我可以使用GraphQL映射它,如下所示:

Report() {
    return new graphql.GraphQLObjectType({
        name: "Report",
        description: "This represents report",
            fields: () => ({
                "modelbrand": {type: graphql.GraphQLString},
                "modelcode": {type: graphql.GraphQLString},
                "avg_free_storage": {type: graphql.GraphQLString}
            })
    });
}

因为我知道属性是固定的。但是如果属性名称像modelbrand,modelcode改变为其他东西(显然它对于不同的报告会有所不同),那么我无法将它映射到GraphQLObjectType中。在这种情况下,我需要另一种类型(应该是JSON类型)来映射这些响应。不幸的是,它不能作为GraphQL的原始类型。我没有找到任何自定义/标量类型或节点库来解决此问题。 stack overflow中有一个解决方案,但似乎无效。

我可以为此获得解决方案吗?一个Nodejs的例子将不胜感激。感谢。

1 个答案:

答案 0 :(得分:2)

请参阅此graphql-type-json。这可以用作自定义标量json类型。

在架构文件

scalar JSON

type User {
  id: ID!
    userDetails: JSON
}

type Query {
  getUser(id: ID!): User
}

在解析程序文件中

import GraphQLJSON from 'graphql-type-json';
import {User} from './connectors';

const resolvers = {

  Query: getUser(_, args) {
    return User.find({
      where: args
    });
  },

  JSON: {
    __serialize(value) {
      return GraphQLJSON.parseValue(value);
    }
  }
}

这可能对您有所帮助