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

Apollo graphQL 订阅使用哪个包

Apollo GraphQL 订阅

Angular Apollo GraphQL watchQuery 与订阅

Apollo - Angular 应用程序中子组件的多个 graphql 订阅

如何在 Apollo 中关闭 GraphQL 订阅的套接字连接