如何从 GraphQL Mutation 返回 Union 类型

Posted

技术标签:

【中文标题】如何从 GraphQL Mutation 返回 Union 类型【英文标题】:How to return a Union type from a GraphQL Mutation 【发布时间】:2020-04-21 01:34:17 【问题描述】:

我想使用此模式从 GraphQL Ruby 返回验证失败:https://medium.com/@sachee/200-ok-error-handling-in-graphql-7ec869aec9bc

从我的突变中,我希望能够返回一个像这样的联合的有效负载:

    class RegistrationPayloadType < Base::Union
      possible_types UserType, ValidationFailureType

      def self.resolve_type(object, context)
        if context.current_user.present?
          UserType
        else
          ValidationFailureType
        end
      end
    end

而我在突变中的解析方法是这样的;

      def resolve(input:)
        @input = input.to_h

        if registration.save
          candidate
        else
          registration.errors
        end
      end

然后客户端可以这样调用突变;

  mutation UserRegistrationMutation($input: UserRegistrationInput!) 
    userRegistration(input: $input) 
      __typename
      ... on User 
        id
      
      ... on ValidationFailure 
        path
        message
      
    
  

如何在 GraphQL-ruby 中返回联合作为有效负载?

【问题讨论】:

【参考方案1】:

这个问题的答案其实很简单。如果你想从突变中返回不同的类型,在我的例子中是上面的 RegistrationPayloadType。

    class RegistrationMutation < Base::Mutation
      argument :input, Inputs::RegistrationInputType, required: true

      payload_type RegistrationPayloadType

      ...
    end

使用 payload_type 类方法得到了我需要的东西。

【讨论】:

【参考方案2】:

这篇博客(https://www.abhaynikam.me/posts/polymorphic-types-with-graphql-ruby/) 介绍了如何在 GraphQL-ruby 中将联合类型用于多态类型。这里,不是使用payload_type,而是返回另一个解析联合类型的字段类型。

【讨论】:

以上是关于如何从 GraphQL Mutation 返回 Union 类型的主要内容,如果未能解决你的问题,请参考以下文章