![](/img/trans.png)
[英]Implement a socket connection in my apollo graphQL express server
[英]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.