订阅结果的联合类型

时间:2020-08-05 11:55:28

标签: graphql union subscription

没有有关如何在订阅上安装graphql联合类型的信息。甚至有可能吗?

type Subscription {
   joinRequest(id: UUID!): MemberUnion!
}

type User { ... }
type Guest { ... }

union MemberUnion = User | Guest

,并且可以完美地与我的查询或变体一起使用,只需要有关如何实现我的订阅的任何信息。 joinRequest键是userIdrolerole代表解析器,其中应该通过传递的user参数获取guestuserId信息。

现在尝试启动代码后出现错误:

“抽象类型“ MemberUnion”必须在运行时解析为字段“ Subscription.joinRequest”的对象类型,其值为{userId:“ 3bdb0eb5-f237-40a7-bebc-6263cc18dba5”,名称:“ trolololo3”,有效载荷:{ ...}},接收到“ null”。“ MemberUnion”类型应提供“ resolveType”功能,或者每种可能的类型应提供“ isTypeOf”功能。”

我的解析器文件,用于导出查询,突变和订阅:

import ....

export default {
  Query: {
    ...User,
    ...Listing,
    ...Products
  },
  Mutation: {
    ...ListingMutations,
    ...ProductsMutations
  },
  Subscription: {
    ...ProductsSubscription,
    ...ListingSubscription
  },
Products: {
    items: ({ id: itemId }) => method({ itemId })
  },
 MemberUnion: {
    // eslint-disable-next-line no-underscore-dangle
    __resolveType: obj => {
      if (obj.role === USER_ROLE.GUEST) {
        return 'Guest';
      }

      if (obj.role === USER_ROLE.USER) {
        return 'User';
      }

      return null;
    }
  },
....

正如我之前所说,当我在要选择用户对象的任何查询或变异响应上实现MemberUnion时,此方法很好用。

1 个答案:

答案 0 :(得分:1)

订阅可以返回抽象类型(联合和接口),就像查询和变异一样。订阅如何处理抽象类型没有什么不同。

如果您看到该特定错误,则问题通常出在有关问题摘要的resolveType函数的实现中。例如,如果您一开始没有提供resolveType函数,或者编写该函数时不一定总是返回带有对象类型名称的字符串。

基于错误({ userId: "3bdb0eb5-f237-40a7-bebc-6263cc18dba5", name: "trolololo3", payload: { ... } })中显示的值,问题还可能在于您如何解决joinRequest字段。您可能首先没有该字段的解析器,或者至少解析器返回的对象的形状与GraphQL期望的形状不匹配(即UserGuest

没有看到更多相关代码,就不可能确定问题出在哪里。