在 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 值,以便使用正确的类型进行存储?

【问题讨论】:

好的,如果你设置了integerstring 的值,那么你会为数据库考虑什么类型 @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只能有对象类型,不能包含StringInt这样的类型 我错了。我错过了这个的非标量部分。我看到这个关于用例的问题: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 生成器

如何处理 GraphQL 中的嵌套输入

如何将 JSONObject 值分配给 graphql 模式文件中的字段?

将 GraphQL 模式拆分为 express-graphql 中不同模块的最佳方法?

如何使用 GraphQL 在 MERN 应用程序的 MongoDB 模式中插入数组字段?