如何在 Apollo 中关闭 GraphQL 订阅的套接字连接

我的 Apollo 服务器上有 GraphQL 订阅,我想在用户注销后关闭它。最初的问题是我们是否应该在客户端或后端关闭此(套接字)连接。


在前端,我将 Angular 与 Apollo Client 结合使用,并通过Subscription从apollo-angular. 我可以使用典型的takeUntilrxjs 实现来关闭订阅通道:


this.userSubscription

  .subscribe()

  .pipe(takeUntil(this.subscriptionDestroyed$))

  .subscribe(

    ({ data }) => {

      // logic goes here

    },

    (error) => {

      // error handling

   }

);

  

但是,这不会关闭服务器上的 websocket,如果我是对的,这将导致订阅内存泄漏。


Apollo Server(和express)的订阅设置方式如下:


const server = new ApolloServer({

  typeDefs,

  resolvers,

  subscriptions: {

    onConnect: (connectionParams, webSocket, context) => {

      console.log('on connect');

      const payload = getAuthPayload(connectionParams.accessToken);

      if (payload instanceof Error) {

        webSocket.close();

      }

      return { user: payload };

    },

    onDisconnect: (webSocket, context) => {

      console.log('on Disconnect');

    }

  },

  context: ({ req, res, connection }) => {

    if (connection) {

      // set up context for subscriptions...

    } else {

      // set up context for Queries, Mutations...

    }

console.log('on connect');当客户端注册新的 GraphQL 订阅时,我总是可以在服务器日志上看到,但console.log('on Disconnect');除非关闭前端应用程序,否则我永远看不到。


我还没有看到任何关于如何关闭 Apollo 订阅的 websocket 的示例。我主要是想完成一个Logout的实现。


我在这里错过了什么吗?提前致谢!


qq_遁去的一_1
浏览 70回答 1
1回答

富国沪深

本质上,我们使用套接字创建订阅的方式是使用subscriptions-transport-wsexport const webSocketClient: SubscriptionClient = new SubscriptionClient(  `${environment.WS_BASE_URL}/graphql`,  {    reconnect: true,    lazy: true,    inactivityTimeout: 3000,    connectionParams: () => ({      params: getParams()    })  });正如问题中所指定的,我想在用户注销之前取消订阅所有频道并关闭订阅套接字连接。我们通过webSocketClient在注销函数中使用 SubscriptionClient 来完成此操作并调用:webSocketClient.unsubscribeAll();webSocketClient.close();
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript