在GraphQL架构中,字段如何是GraphQLString以及GraphQLInt?

时间:2017-02-20 05:33:38

标签: graphql relayjs relay graphql-js

这是来自GraphQL架构的快速应用程序的代码: -

let data = new GraphQLObjectType({
    name:"Data",
    fields: {
        id: {type: GraphQLID},
        value: {type: GraphQLString} // TODO: allow for string as well as int
    }
});

我怎样才能做出价值'字段接受字符串值以及int值,以便可以使用正确的类型存储它?

2 个答案:

答案 0 :(得分:1)

根据您的评论说您使用的NoSQL数据库可以将字符串和整数放在同一个字段中,您应该使用GraphQLString。在创建上述对象的新实例时,您可以为resolve字段创建value方法,该方法将检查传递的值是string还是int(当然它总是因为GraphQLString类型是字符串,但它可以是像"123"这样的字符串,可以解析为int) - 据此,您可以在保存到数据库之前执行一些解析。 另一方面,当您从数据库中检索数据时,它将始终作为图形表示中的string出现 - 如果不是这种情况,我认为这可能是一个简单的解决方案。

但是,如果你对这个命题不满意,我恐怕你不能按照你的想法欺骗GraphQL。每个字段只能获得单一类型的定义。

答案 1 :(得分:0)

修改: 此解决方案对此问题无效。它仅适用于对象类型而非标量

您应该查看GraphQLUnionTypehttp://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}
    }
});