在 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:尝试使用自定义 DateTime 标量,但出现错误
TypeScript,Apollo GraphQL 产生不可分配的节点获取错误