在 GraphQL 模式中,字段如何既是 GraphQLString 又是 GraphQLInt?
Posted
技术标签:
【中文标题】在 GraphQL 模式中,字段如何既是 GraphQLString 又是 GraphQLInt?【英文标题】:In GraphQL schema, how can a field be GraphQLString as well as GraphQLInt? 【发布时间】:2017-07-09 07:05:39 【问题描述】:这是我的 GraphQL 模式快速应用程序的代码:-
let data = new GraphQLObjectType(
name:"Data",
fields:
id: type: GraphQLID,
value: type: GraphQLString // TODO: allow for string as well as int
);
如何让“value”字段接受字符串值和 int 值,以便使用正确的类型进行存储?
【问题讨论】:
好的,如果你设置了integer
和string
的值,那么你会为数据库考虑什么类型
@p0k8_ GraphQL 的重点是隐藏数据库细节。这个值是否来自数据库 A 或 B 或某个文件或其他 API 无关紧要。所以拥有联合类型是完全有效的
graphql 提供 int
但该类型的数据库架构是 string
然后 ??
是一个nosql数据库,可以直接存储json对象。因此,一个字符串将被保存为字符串,而一个 int 将被保存为 int。
【参考方案1】:
编辑: 此解决方案对该问题无效。它仅适用于对象类型,不适用于标量
你应该看看GraphQLUnionType
:http://graphql.org/graphql-js/type/#graphqluniontype
我不习惯定义这样的类型,但我希望它像下面这样:
var ValueType = new GraphQLUnionType(
name: 'Value',
types: [ GraphQLString, GraphQLInt ],
resolveType(value)
if (value instanceof string)
return GraphQLString;
if (value instanceof number)
return GraphQLInt;
);
let data = new GraphQLObjectType(
name:"Data",
fields:
id: type: GraphQLID,
value: type: ValueType
);
【讨论】:
UnionType
只能有对象类型,不能包含String
或Int
这样的类型
我错了。我错过了这个的非标量部分。我看到这个关于用例的问题:github.com/facebook/graphql/issues/215
我认为这个答案获得赞成票是一种误导,因为它不适用于这种情况。我要求将其再次设置为 0。我还没有足够的声望来做出这个改变。
我同意@NikhilAgarwal 的赞成票。这没有意义。【参考方案2】:
根据您的评论说您使用可以将字符串和整数放在同一字段中的 NoSQL 数据库,您应该使用GraphQLString
。在创建上述对象的新实例时,您可以为value
字段创建一个resolve
方法,该方法将检查传递的值是string
还是int
(当然它始终是字符串,因为GraphQLString
类型, 但是它可以是像 "123"
这样的字符串,可以解析为 int) - 根据这个,您可以在保存到数据库之前执行一些解析。
另一方面,当您从数据库中检索数据时,它总是会在 graphql 表示中以 string
的形式出现 - 如果不是这种情况,我认为这可能是一个简单的解决方案。
但是,如果你对这个命题不满意,恐怕你也无法随心所欲地欺骗 GraphQL。每个字段只能获得单一类型定义。
【讨论】:
以上是关于在 GraphQL 模式中,字段如何既是 GraphQLString 又是 GraphQLInt?的主要内容,如果未能解决你的问题,请参考以下文章
了解 GraphQL / Sangria-Graphql 中服务器端的特定字段
如何从 GraphQL 生成 Dart - graphql 到 dart 生成器
如何将 JSONObject 值分配给 graphql 模式文件中的字段?