Apollo GraphQL取消订阅似乎已损坏

时间:2019-08-28 09:36:37

标签: apollo graphql-subscriptions

我们正在使用Apollo GraphQL在node.js后端和react前端中进行订阅(通过websockets)。 该应用程序提供设备列表。当用户单击一台设备时,他会获得实时更新的设备监控数据(来自订阅)。当用户单击另一台设备时,订阅将停止,下一个设备的数据将被加载和订阅。

我从下面的websocket连接中粘贴了消息。我首先尝试将原始日志粘贴到此处,但是屏幕截图更易于阅读。

请忽略ID 1-5。对于我的问题,重要的是ID 6和7。在第一个设备上单击时(在11:15:35)创建了ID,然后关闭了详细信息,因此订阅已停止(在11:15:36)。现在,用户单击另一台设备并开始订阅7。几秒钟后,系统为第6个和第7个订阅推送数据。

我有什么办法可以做到,“停止”实际上意味着“停止”,或者这是一个错误吗?

Screenshot of the websocket messages

编辑:根据要求,这是我用来订阅/退订的代码(由于公司规定,我不得不削减部分内容)

    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 个答案:

答案 0 :(得分:2)

在较旧的apollo graphql或nestjs-apollo-graphql版本中,这似乎是一个错误(我们在后端使用了那些框架)。将所有后端依赖项升级到“最新”之后,该错误似乎不再存在。