在 Apollo graphql 服务器中检测退订

Posted

技术标签:

【中文标题】在 Apollo graphql 服务器中检测退订【英文标题】:Detect an unsubscribe in Apollo graphql server 【发布时间】:2019-11-15 02:31:49 【问题描述】:

在 Apollo 服务器中,当客户端用户订阅订阅(使用 WebSocket)时,我们可以使用订阅解析器检测到这一点。

但是还有一种方法可以检测退订吗? 我看到 WebSocket 发送了一个"id": "1", "type": "stop" 消息,但我不知道如何捕捉这个

所以我不想知道用户何时断开与 Websocket 的连接,而是想知道用户何时取消了 Apollo 客户端的订阅。

【问题讨论】:

你找到解决办法了吗? 【参考方案1】:

Apollo 2,如果你想通过 withFilter 函数使用订阅:

subscribe: withFilter(
      (payload, variables, context, info) =>
        withCancel(pubsub.asyncIterator(JOIN_LIVE), () => 
           
          console.log("That our variable " , variables);
        ),
      async (payload, response) => 
        try 
          return (
            payload.channel.toString() === response.ChannelRoom.toString()
          );
         catch (error) 
          return error.message;
        
      

【讨论】:

【参考方案2】:

我也遇到了同样的问题,不敢相信这不是 GraphQL 内置的,也没有包含在文档中。

我在 github 问题中找到了解决方案,您可以阅读 here

我修复它的方式是:

withCancel 函数添加到我的解析器:

const withCancel = (asyncIterator, onCancel) => 
  const asyncReturn = asyncIterator.return;

  asyncIterator.return = () => 
    onCancel();
    return asyncReturn ? asyncReturn.call(asyncIterator) : Promise.resolve( value: undefined, done: true );
  ;

  return asyncIterator;
;

然后在我的订阅中使用它:

Subscription: 
    update: 
      subscribe: (root,  id, topic , ctx, info) => 
        logger.info(`start new subscription for $id`);
        ActiveMQ(id, topic);

        return withCancel(pubsub.asyncIterator(id), () => 
          console.log(`Subscription closed, do your cleanup`);
        );
      ,
      resolve: payload => 
        return payload;
      ,
    ,
  

然后我在withCancel 提供的回调中处理了我的逻辑,这对我来说是关闭一个 stomp 客户端并清理活动订阅者列表等

【讨论】:

他们有subscribe: ... 但没有unsubscribe: ... 似乎很疯狂。但这对我有用,多么专业的答案!

以上是关于在 Apollo graphql 服务器中检测退订的主要内容,如果未能解决你的问题,请参考以下文章

如何在 apollo graphql 服务器中编写解析 graphql 过滤器

GraphQL + Apollo 请求

如何在 GraphQL Apollo 客户端中处理异步突变

如何在 apollo graphQL 服务器的枚举值中添加特殊字符?

在哪里查看 Apollo 服务器 express GraphQL 缓存?

Apollo 服务器 GraphQL 网络问题