没有有关如何在订阅上安装graphql联合类型的信息。甚至有可能吗?
type Subscription {
joinRequest(id: UUID!): MemberUnion!
}
type User { ... }
type Guest { ... }
union MemberUnion = User | Guest
,并且可以完美地与我的查询或变体一起使用,只需要有关如何实现我的订阅的任何信息。 joinRequest
键是userId
和role
。 role
代表解析器,其中应该通过传递的user
参数获取guest
或userId
信息。
现在尝试启动代码后出现错误:
“抽象类型“ 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
时,此方法很好用。
答案 0 :(得分:1)
订阅可以返回抽象类型(联合和接口),就像查询和变异一样。订阅如何处理抽象类型没有什么不同。
如果您看到该特定错误,则问题通常出在有关问题摘要的resolveType
函数的实现中。例如,如果您一开始没有提供resolveType
函数,或者编写该函数时不一定总是返回带有对象类型名称的字符串。
基于错误({ userId: "3bdb0eb5-f237-40a7-bebc-6263cc18dba5", name: "trolololo3", payload: { ... } }
)中显示的值,问题还可能在于您如何解决joinRequest
字段。您可能首先没有该字段的解析器,或者至少解析器返回的对象的形状与GraphQL期望的形状不匹配(即User
或Guest
)
没有看到更多相关代码,就不可能确定问题出在哪里。