2

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

...
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 连接: Chrome 开发人员工具的“网络”选项卡 作为 GraphQL 订阅的传输,我使用subscriptions-transport-ws包。

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

先感谢您!

4

1 回答 1

0

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

于 2018-02-12T19:58:51.570 回答