Javascript 如何在Apollo中关闭GraphQL订阅的套接字连接
我想在用户注销后关闭Apollo服务器上的GraphQL订阅。最初的问题是我们是应该在客户端还是在后端关闭这个(套接字)连接 在前端,我将Angular与Apollo客户端一起使用,并通过扩展Apollo Angular的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$
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')服务器日志上的code>,但我从未看到console.log('on Disconnect')代码>除非我关闭前端应用程序
我还没有看到任何关于如何关闭websocket以订阅Apollo的示例。我主要想这样做来完成注销实现
我是不是遗漏了什么?提前谢谢 我在Apollo客户端GitHub网站上发布了一个相关讨论。你能解决这个问题吗?@p4sh4是的,我将在今天晚些时候发布解决方案。请将实际解决方案添加到你的答案中,