我的 Apollo 服务器上有 GraphQL 订阅,我想在用户注销后关闭它。最初的问题是我们是否应该在客户端或后端关闭此(套接字)连接。在前端,我将 Angular 与 Apollo Client 结合使用,并通过Subscription从apollo-angular. 我可以使用典型的takeUntilrxjs 实现来关闭订阅通道:this.userSubscription .subscribe() .pipe(takeUntil(this.subscriptionDestroyed$)) .subscribe( ({ data }) => { // logic goes here }, (error) => { // error handling }); 但是,这不会关闭服务器上的 websocket,如果我是对的,这将导致订阅内存泄漏。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... }console.log('on connect');当客户端注册新的 GraphQL 订阅时,我总是可以在服务器日志上看到,但console.log('on Disconnect');除非关闭前端应用程序,否则我永远看不到。我还没有看到任何关于如何关闭 Apollo 订阅的 websocket 的示例。我主要是想完成一个Logout的实现。我在这里错过了什么吗?提前致谢!
1 回答
富国沪深
TA贡献1790条经验 获得超9个赞
本质上,我们使用套接字创建订阅的方式是使用subscriptions-transport-ws
export const webSocketClient: SubscriptionClient = new
SubscriptionClient(
`${environment.WS_BASE_URL}/graphql`,
{
reconnect: true,
lazy: true,
inactivityTimeout: 3000,
connectionParams: () => ({
params: getParams()
})
}
);
正如问题中所指定的,我想在用户注销之前取消订阅所有频道并关闭订阅套接字连接。我们通过webSocketClient在注销函数中使用 SubscriptionClient 来完成此操作并调用:
webSocketClient.unsubscribeAll();
webSocketClient.close();
添加回答
举报
0/150
提交
取消