【发布时间】: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 连接中可见。
【问题讨论】:
-
请编辑您的问题以显示您取消订阅的实际代码。
-
我添加了代码,虽然我认为回答这个问题没有帮助。
标签: apollo graphql-subscriptions