每次更改时多次触发QraphQl订阅解析程序

时间:2018-02-12 19:45:34

标签: angular graphql graphql-subscriptions

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

答案 0 :(得分:0)

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