Apollo GraphQL 取消订阅似乎坏了
Posted
技术标签:
【中文标题】Apollo GraphQL 取消订阅似乎坏了【英文标题】:Apollo GraphQL unsubscribe seems to be broken 【发布时间】:2020-01-01 11:58:14 【问题描述】:我们在 node.js 后端和 react 前端中使用 Apollo GraphQL 和订阅(通过 websockets)。 该应用程序提供了设备列表。当用户点击一台设备时,他会通过实时更新(来自订阅)获取该设备的监控数据。当用户点击另一个设备时,订阅停止,下一个设备的数据正在加载和订阅。
我从下面的 websocket 连接中粘贴了消息。我首先尝试将原始日志粘贴到此处,但屏幕截图更易于阅读。
请忽略 ID 1-5。对我的问题来说重要的是 id 6 和 7。当点击第一台设备时(在 11:15:35)创建 id,然后关闭详细信息,因此停止订阅(在 11:15:36)。现在用户点击另一个设备并开始订阅 7。几秒钟后,系统推送第 6 和第 7 个订阅的数据。
有什么我可以做的吗?“停止”实际上意味着“停止”还是这是一个错误?
编辑:根据要求,这是我用来订阅/取消订阅的代码(由于公司规定,我不得不削减一些部分)
const subscription = useRef(null)
const loading, data, error, subscribeToMore = useQuery(getDevice, variables: deviceId )
useEffect(() =>
return () =>
if (!subscription.current) return
subscription.current()
subscription.current = null
, [deviceId])
if (!subscription.current)
subscription.current = subscribeToMore(
document: geDeviceSubscription,
variables:
deviceId
,
updateQuery: (prev, subscriptionData ) => ( device: subscriptionData.data.subscribeDevice )
)
编辑 2:这肯定不是我的客户问题,因为如果使用 GraphiQL gui、开始订阅并再次停止它,也会发生这种情况。新数据未显示,但在浏览器(chrome)的网络选项卡中的 websocket 连接中可见。
【问题讨论】:
请编辑您的问题以显示您取消订阅的实际代码。 我添加了代码,虽然我认为回答这个问题没有帮助。 【参考方案1】:这似乎是旧版 apollo graphql 或 nestjs-apollo-graphql 版本中的一个错误(我们在后端使用这些框架)。将所有后端依赖项升级到“最新”后,该错误似乎并没有持续存在。
【讨论】:
以上是关于Apollo GraphQL 取消订阅似乎坏了的主要内容,如果未能解决你的问题,请参考以下文章
使用 Express-GraphQL 和 React-Apollo 订阅 GraphQL
Angular Apollo GraphQL watchQuery 与订阅