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

Posted

技术标签:

【中文标题】如何在 Apollo 中关闭 GraphQL 订阅的套接字连接【英文标题】:How to close socket connection for GraphQL subscription in Apollo 【发布时间】:2021-03-21 06:23:48 【问题描述】:

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

在前端,我将 Angular 与 Apollo 客户端一起使用,并通过从 apollo-angular 扩展 Subscription 类来处理 GraphQL 订阅。我可以使用典型的takeUntil rxjs 实现来关闭订阅频道:

this.userSubscription
  .subscribe()
  .pipe(takeUntil(this.subscriptionDestroyed$))
  .subscribe(
    ( data ) => 
      // logic goes here
    ,
    (error) => 
      // error handling
   
);
  

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

Apollo 服务器(和 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...
    

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

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

我在这里遗漏了什么吗?提前致谢!

【问题讨论】:

你能解决这个问题吗? @p4sh4 是的,我将在今天晚些时候发布解决方案 【参考方案1】:

我在 Apollo Client GitHub 网站上的相关讨论中发布了 my solution。

【讨论】:

请将实际解决方案添加到您的答案中,not just a link to it

以上是关于如何在 Apollo 中关闭 GraphQL 订阅的套接字连接的主要内容,如果未能解决你的问题,请参考以下文章

如何立即触发 apollo graphql 订阅?

如何在 jest / apollo 客户端中捕获被拒绝的 graphql 订阅?

使用 Express-GraphQL 和 React-Apollo 订阅 GraphQL

如何使用 apollo ios 客户端实现 graphql 订阅

Apollo GraphQL 订阅

Angular Apollo GraphQL watchQuery 与订阅