【问题标题】:How to handle a field that could return one of several scalar types in graphql如何处理可以返回graphql中几种标量类型之一的字段
【发布时间】:2018-09-12 13:40:45
【问题描述】:

在 graphql(使用出色的 graphql-ruby gem)中,我试图返回一个对象,其字段可以等于布尔值、整数或字符串。我最初的想法是返回布尔、整数或字符串的联合,但 graphql-ruby 告诉我联合不能包含标量类型(我想这是规范强加的约束,而不是 graphql-ruby)。

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

谢谢!

【问题讨论】:

    标签: graphql graphql-ruby


    【解决方案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
    

    注意:这个实现实际上也允许浮点数

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2019-03-18
    • 2015-09-17
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多