每次更改多次触发 GraphQl 订阅解析器

Posted

技术标签:

【中文标题】每次更改多次触发 GraphQl 订阅解析器【英文标题】:Fire QraphQl subscription resolver multiple times per single change 【发布时间】:2018-07-23 02:06:28 【问题描述】:

使用 GraphQl 订阅我正面临一个奇怪的问题。 出于实时更新的目的,我在服务器 (NodeJs) 上使用 MongoDB Change Stream 功能并为前端 (Angular) 使用 GraphQl 订阅。因此,当数据库中出现一些更改时,它会通过 GraphQl 订阅发送到客户端。 在 Angular 组件上,有 GraphQl 订阅实现(使用Apollo client):

...
ngOnInit() 
    this.subscribeToApprovedNews(this.params);


subscribeToApprovedNews(params) 
  this.newsQuery.subscribeToMore(
      document: addApprovedNews,
      variables: 
        projectId: params
      ,
      updateQuery: (previous,  subscriptionData ) => 
        ...
        const newItem = subscriptionData.data['addApprovedNews'];
        console.log(`$params -> added news -> $newItem`);
        ...
      
  );

但是当我们进入这个组件 n 次时,在 数据库中的一次更改 上,我们会收到这 n 次订阅的数据。 据我了解,当我们进入组件时,客户端已经建立了新的 WebSocket 连接: "Network" tab of the Chrome developer tools 作为 GraphQL 订阅的传输,我使用 subscriptions-transport-ws 包。

因此,数据库上的一个更改会触发多个 QraphQl 订阅解析器,因此在客户端,我们会收到有关更改的重复通知。 如何解决此问题并无论用户进入组件多少次,每次订阅都只接收一个数据

提前谢谢你!

【问题讨论】:

【参考方案1】:

我认为您应该在离开组件时取消订阅。好地方是 ngOnDestroy 方法。

【讨论】:

你说得对!顺便说一句,这个resource 描述了如何为subscribeToMore 实现取消订阅方法。谢谢!

以上是关于每次更改多次触发 GraphQl 订阅解析器的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL/Prisma 订阅仅针对 DELETE 触发

GraphQL 订阅字段无法访问解析器的上下文

嵌套查询/解析器时的 GraphQL.js 订阅响应错误

Apollo GraphQL - 未触发解析器

导入 GraphQL 解析器和模式触发错误

Apollo 客户端解析器仅触发一次