所以我有 NestJs 应用程序,我在其中有多个订阅。从我的带有 apolloClinet 的 React 应用程序的客户端,我正在连续监听一个通知监听器。
我还有消息订阅,可以在聊天时获取新消息。我希望我的设置设置为当用户打开 chatRoom 以在数据库中添加侦听器时,以及当他离开 fetchNewMessages 订阅以从 chatRoom Listeners 中删除时
所以我在我的订阅解析器上执行了此操作,该解析器在 chatRoom 侦听器列表中添加了 currentUser
fetchNewMessage(@CurrentUser('') user: User, @Args('chatRoomId') chatRoomId: string) {
this.messagesService.addRemoveListenerOnChatRoom(chatRoomId, user.id, 'add')
return PubSub.asyncIterator('newMessage')
}
但是当我离开聊天室时,我无法访问 onDisconnect 属性来将它们从侦听器中删除
我在应用程序上只有主应用程序 graphql-ws onDisconnect 方法
subscriptions: {
'graphql-ws': {
onConnect: context => {
const { connectionParams, extra } = context
const authToken = connectionParams.Authorization && connectionParams.Authorization.replace('Bearer ', '')
const user = authService.getJwtPayLoad(authToken)
// when using with graphql-ws, additional context value should be stored in the extra field
extra.headers = { user, authorization: connectionParams.Authorization }
},
onDisconnect: (websocket, context) => {
const user = context.extra.user
user && messagesService.addRemoveListenerOnChatRoom(null, user.id, 'remove')
},
},
context: ({ extra }) => {
return extra
// you can now access your additional context value through the extra field
},
但这没有用,因为我总是在监听通知订阅,所以如果我离开 fetchNewChatRoom 监听器,这个 onDisconnect 将不起作用
那么关于多订阅服务器有什么建议或最佳实践吗?我可以在断开连接时调整个人订阅的属性吗?
我们在内部使用可观察量,并将它们转换为订阅解析器中的异步迭代器。
通过这样做,您可以使用 rxjs 的 finalize 在订阅结束时执行某些操作。看起来像这样
fetchNewMessage(user, chatRoomId) {
this.messagesService.addRemoveListenerOnChatRoom(chatRoomId, user.id, 'add');
const obs = this.messageService.subscribeToNewMessages().pipe(
finalize(() => this.messagesService.addRemoveListenerOnChatRoom(chatRoomId, user.id, 'remove'))
);
return createAsyncIteratorFromObservable(obs);
}