如何 return 来自 GraphQL 突变的联合类型

How to return a Union type from a GraphQL Mutation

我想将此模式用于 returning 来自 GraphQL 的验证失败 Ruby:https://medium.com/@sachee/200-ok-error-handling-in-graphql-7ec869aec9bc

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

    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

而我在 mutation 中的 resolve 方法是这样的;

      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 中 return 联合作为有效负载?

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

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

      payload_type RegistrationPayloadType

      ...
    end

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

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