为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

qq_遁去的一_1 2023-11-02 21:51:58
我的 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的实现。我在这里错过了什么吗?提前致谢!
查看完整描述

1 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

本质上,我们使用套接字创建订阅的方式是使用subscriptions-transport-ws

export 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();


查看完整回答
反对 回复 2023-11-02
  • 1 回答
  • 0 关注
  • 62 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信