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

Javascript 如何在Apollo中关闭GraphQL订阅的套接字连接,javascript,express,graphql,apollo,apollo-server,Javascript,Express,Graphql,Apollo,Apollo Server,我想在用户注销后关闭Apollo服务器上的GraphQL订阅。最初的问题是我们是应该在客户端还是在后端关闭这个(套接字)连接 在前端,我将Angular与Apollo客户端一起使用,并通过扩展Apollo Angular的Subscription类来处理GraphQL订阅。我能够通过典型的takeUntilrxjs实现关闭订阅频道: this.userSubscription .subscribe() .pipe(takeUntil(this.subscriptionDestroyed$

我想在用户注销后关闭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,如果我是对的,这将导致订阅内存泄漏

阿波罗服务器(和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的示例。我主要想这样做来完成注销实现


我是不是遗漏了什么?提前谢谢

我在Apollo客户端GitHub网站上发布了一个相关讨论。

你能解决这个问题吗?@p4sh4是的,我将在今天晚些时候发布解决方案。请将实际解决方案添加到你的答案中,