如何从 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 类型的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Apollo 从 GraphQL Mutation 设置 Auth token cookie

React Apollo GraphQL Mutation 返回 400(错误请求)

Graphql shield 返回 Not Authorized for allowed mutation

graphql 突变不返回嵌套字段

使用函数生成器将值返回到 GraphQL Mutation 中的 outputFields

Apollo GraphQL“不能为不可为空的字段 Mutation.createUser 返回 null”