在 Apollo GraphQL 服务器中检测取消订阅

6
在Apollo服务器中,当客户端用户订阅一个订阅(使用WebSocket),我们可以使用订阅解析器来检测到这一点。
但是,是否也有一种方法可以检测取消订阅呢?我看到WebSocket发送一个{"id": "1", "type": "stop"}消息,但我不知道如何捕捉它。
因此,我不想知道用户何时从WebSocket断开连接,而是想知道用户何时使用Apollo客户端取消了订阅。

你找到任何解决方案了吗? - rufai demir
2个回答

15

我一直遇到同样的问题,无法相信GraphQL没有内置此功能或在文档中涵盖。

我在一个github问题中找到了解决方案,您可以在此处阅读。

我解决它的方式是:将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客户端并清理活动订阅者列表等。


5
他们有“subscribe:...”,但没有“unsubscribe:...”,这看起来很奇怪。但对我来说是可行的,这真是一个高级的答案! - justin.m.chase

0
Apollo 2,如果你想使用带有过滤器函数的subscribe:
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;
        }
      }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接