【发布时间】:2020-11-02 00:10:42
【问题描述】:
我正在编写一个 graphql 订阅服务器。如果我编写一个查询,将解析器嵌套在另一个中是没有问题的,所以查询看起来像这样:
query {
messages {
privateMessage {
id
message
userId
}
}
}
所以首先执行messages 解析器,然后执行privateMessage 解析器。
我想知道订阅是否可以实现相同的结构,所以它看起来像这样:
subscription {
messages {
privateMessage {
id
message
userId
}
}
}
编辑:
这是我当前拥有的根订阅模式:
const RootSubscriptions = new GraphQLObjectType({
name: 'RootSubscriptions',
fields: {
privateMessage: {
type: PrivateMessage.type,
resolve: PrivateMessage.resolve,
subscribe: PrivateMessage.subscribe,
},
flaggedMessage: {
type: FlaggedMessage.type,
resolve: FlaggedMessage.resolve,
subscribe: FlaggedMessage.subscribe,
},
teamMessage: {
type: TeamMessage.type,
resolve: TeamMessage.resolve,
subscribe: TeamMessage.subscribe,
},
},
})
我希望它看起来像这样:
const RootSubscriptions = new GraphQLObjectType({
name: 'RootSubscriptions',
fields: {
messages: {
type: new GraphQLObjectType({
name: 'MessagesSubType',
fields: {
privateMessage: {
type: PrivateMessage.type,
resolve: PrivateMessage.resolve,
subscribe: PrivateMessage.subscribe,
},
flaggedMessage: {
type: FlaggedMessage.type,
resolve: FlaggedMessage.resolve,
subscribe: FlaggedMessage.subscribe,
},
teamMessage: {
type: TeamMessage.type,
resolve: TeamMessage.resolve,
subscribe: TeamMessage.subscribe,
},
}
})
}
},
})
编辑结束
问题是我让messages subscribe 函数运行,但没有privateMessage subscribe 函数运行。很想知道它是否可能以及如何实现它。
由于我是用 node.js 编写的,因此我会很感激 js 中的一个示例,但是任何指向解决方案的指针都会有所帮助。
提前致谢!
【问题讨论】:
-
您是否完成了任何所需的 websocket 配置?假设已经完成,您能否提供为订阅定义的架构
-
@GregBrodzik 感谢您的评论。我添加了架构代码。是的,当前结构中的订阅工作没有问题,返回的异步迭代器、网络套接字和所有这些传奇。
-
@U Rogel 我通常使用 pubsub 实例在正确的时间触发,通常在突变中,并且不依赖 subresolve 数据结构。但是,如果您要从突变中返回消息类型,就像在您的查询中一样,则应该命中私人消息的子解析器 - 类似于您的查询。因此,也许您可以使用
obj从子解析器的上下文中触发 pubsub,并在此处合并任何其他数据以补充返回的子有效负载。您可以使用info来确定您是否在正确的上下文中触发。 -
您是否考虑过为消息创建根订阅,然后提供消息类型作为参数?这样,订阅是针对消息的,但在解析器中,您可以为每种消息类型切换大小写,在本例中为私有、标记和团队
-
@Kisinga 这是我收到的关于我的问题的最有趣的评论,非常感谢!但这仍然意味着对不相关的数据进行多次迭代。我想通过完全订阅我需要的内容来尝试跳过这些迭代。
标签: javascript graphql