qq_遁去的一_1
2023-11-02 21:51:58
我的 Apollo 服務(wù)器上有 GraphQL 訂閱,我想在用戶注銷后關(guān)閉它。最初的問題是我們是否應(yīng)該在客戶端或后端關(guān)閉此(套接字)連接。在前端,我將 Angular 與 Apollo Client 結(jié)合使用,并通過Subscription從apollo-angular. 我可以使用典型的takeUntilrxjs 實現(xiàn)來關(guān)閉訂閱通道:this.userSubscription .subscribe() .pipe(takeUntil(this.subscriptionDestroyed$)) .subscribe( ({ data }) => { // logic goes here }, (error) => { // error handling }); 但是,這不會關(guān)閉服務(wù)器上的 websocket,如果我是對的,這將導(dǎo)致訂閱內(nèi)存泄漏。Apollo Server(和express)的訂閱設(shè)置方式如下: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 訂閱時,我總是可以在服務(wù)器日志上看到,但console.log('on Disconnect');除非關(guān)閉前端應(yīng)用程序,否則我永遠看不到。我還沒有看到任何關(guān)于如何關(guān)閉 Apollo 訂閱的 websocket 的示例。我主要是想完成一個Logout的實現(xiàn)。我在這里錯過了什么嗎?提前致謝!
1 回答

富國滬深
TA貢獻1790條經(jīng)驗 獲得超9個贊
本質(zhì)上,我們使用套接字創(chuàng)建訂閱的方式是使用subscriptions-transport-ws
export const webSocketClient: SubscriptionClient = new?
SubscriptionClient(
? `${environment.WS_BASE_URL}/graphql`,
? {
? ? reconnect: true,
? ? lazy: true,
? ? inactivityTimeout: 3000,
? ? connectionParams: () => ({
? ? ? params: getParams()
? ? })
? }
);
正如問題中所指定的,我想在用戶注銷之前取消訂閱所有頻道并關(guān)閉訂閱套接字連接。我們通過webSocketClient在注銷函數(shù)中使用 SubscriptionClient 來完成此操作并調(diào)用:
webSocketClient.unsubscribeAll();
webSocketClient.close();
添加回答
舉報
0/150
提交
取消