在 Nodejs 中以 GraphQL 类型分配 JSON

Posted

技术标签:

【中文标题】在 Nodejs 中以 GraphQL 类型分配 JSON【英文标题】:Assigning JSON in a GraphQL type in Nodejs 【发布时间】:2018-04-06 05:12:42 【问题描述】:

我正在使用 Nodejs 调用一个报告 API,它给了我一个 JSON 响应。可以使用不同的 ID(在本例中为不同的报告 ID)调用 API。例如:

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

等等。由于id在不同的时间不同,它会给我不同的反应。属性/s 名称将不同。所以我不能将它映射到 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 示例将不胜感激。谢谢。

【问题讨论】:

你是如何使用带有下划线的属性进行类型映射的,比如上面的avg_free_storage 【参考方案1】:

请参考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);
    
  

这可能对你有帮助

【讨论】:

以上是关于在 Nodejs 中以 GraphQL 类型分配 JSON的主要内容,如果未能解决你的问题,请参考以下文章

NodeJs GraphQL 枚举类型值作为动态

NodeJS/GraphQL:尝试使用自定义 DateTime 标量,但出现错误

TypeScript,Apollo GraphQL 产生不可分配的节点获取错误

将接口类型分配给代码优先的 GraphQL 解析器参数

使用 NodeJS 发送基于 DynamoDb 流的 graphQL 突变

GraphQL,如何返回字节[]的类型