使用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订阅解析程序,因此在客户端,我们会收到有关更改的重复通知。 无论用户输入组件的次数,如何修复此行为以及每次订阅只能接收一个数据?
提前谢谢!
答案 0 :(得分:0)
我认为你离开组件时应该取消订阅。好地方是ngOnDestroy方法。