如何处理可以返回graphql中几种标量类型之一的字段

时间:2018-04-03 09:23:33

标签: graphql graphql-ruby

在graphql中(使用优秀的graphql-ruby gem),我试图返回一个对象,该对象的字段可以等于Boolean,Integer或String。我最初的想法是返回一个Boolean,Integer或String的联合,但graphql-ruby告诉我,联合不能包含标量类型(我想这是规范强加的约束,而不是graphql-ruby)。

我能想到的解决方案(不是很好)是将值作为json字符串返回并在客户端解析它。有没有更好的方法来处理可能是几个标量之一的返回值?

谢谢!

1 个答案:

答案 0 :(得分:1)

我已经能够通过创建graphql自定义标量类型来完成此操作,该类型只需检查以确保该值是布尔值,整数或字符串,如果是,则返回该值不变。否则,返回错误。此解决方案不需要在客户端进行任何额外的解析。

在graphql-ruby中,实现看起来像

GraphScalar::AnyPrimative = GraphQL::ScalarType.define do
  name "AnyPrimativeScalar"

  coerce_input ->(value, ctx) { 
    case value
    when String, TrueClass, FalseClass, Integer, Float then value
    else
      GraphQL::ExecutionError.new("Invalid value type: #{value.class.name}")
    end
  }

  coerce_result ->(value, ctx) { 
    case value
    when String, TrueClass, FalseClass, Integer, Float then value
    else
      GraphQL::ExecutionError.new("Invalid value type: #{value.class.name}")
    end
  }
end

注意:此实现实际上也允许浮动