我们正在使用Apollo GraphQL在node.js后端和react前端中进行订阅(通过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连接中可见。
答案 0 :(得分:2)
在较旧的apollo graphql或nestjs-apollo-graphql版本中,这似乎是一个错误(我们在后端使用了那些框架)。将所有后端依赖项升级到“最新”之后,该错误似乎不再存在。