每次更改多次触发 GraphQl 订阅解析器
Fire QraphQl subscription resolver multiple times per single change
使用 GraphQl 订阅时我遇到了一个奇怪的问题。
为了实时更新,我在服务器 (NodeJs) 上使用 MongoDB Change Stream 功能,在前端使用 GraphQl 订阅 (Angular)。因此,当数据库中出现一些更改时,它会通过 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 订阅解析器,因此在客户端我们会收到有关更改的重复通知。
如何解决此问题并无论用户输入组件多少次,每个订阅只接收一个数据?
提前致谢!
我认为您应该在离开组件时取消订阅。好的地方是 ngOnDestroy 方法。
使用 GraphQl 订阅时我遇到了一个奇怪的问题。 为了实时更新,我在服务器 (NodeJs) 上使用 MongoDB Change Stream 功能,在前端使用 GraphQl 订阅 (Angular)。因此,当数据库中出现一些更改时,它会通过 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 订阅解析器,因此在客户端我们会收到有关更改的重复通知。 如何解决此问题并无论用户输入组件多少次,每个订阅只接收一个数据?
提前致谢!
我认为您应该在离开组件时取消订阅。好的地方是 ngOnDestroy 方法。