簡體   English   中英

如何在 Apollo 中關閉 GraphQL 訂閱的套接字連接

[英]How to close socket connection for GraphQL subscription in Apollo

我的 Apollo 服務器上有 GraphQL 訂閱,我想在用戶注銷后關閉。 最初的問題是我們應該在客戶端還是在后端關閉這個(套接字)連接。

在前端,我將 Angular 與 Apollo 客戶端一起使用,我通過從apollo-angular擴展Subscription class 來處理 GraphQL 訂閱。 我可以使用典型的takeUntil rxjs 實現來關閉訂閱頻道:

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

但是,這不會關閉服務器上的 websocket,如果我是對的,這將導致訂閱 memory 泄漏。

為訂閱設置 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...
    }

當客戶端注冊新的 GraphQL 訂閱時,我總是會看到console.log('on connect'); 在服務器日志上,但我從來沒有看到console.log('on Disconnect'); 除非我關閉前端應用程序。

我還沒有看到任何關於如何關閉 websocket 以使用 Apollo 訂閱的示例。 我主要想這樣做來完成一個 Logout 實現。

我在這里錯過了什么嗎? 提前致謝!

我在 Apollo Client GitHub 站點上的相關討論中發布了我的解決方案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM