在多订阅 Nestjs 服务器上跟踪 onDisconnect

问题描述 投票:0回答:1

所以我有 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 将不起作用

那么关于多订阅服务器有什么建议或最佳实践吗?我可以在断开连接时调整个人订阅的属性吗?

graphql nestjs apollo react-apollo subscription
1个回答
0
投票

我们在内部使用可观察量,并将它们转换为订阅解析器中的异步迭代器。

通过这样做,您可以使用 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);
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.