在Apollo graphql服务器中检测退订

时间:2019-07-04 10:54:22

标签: apollo apollo-server

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

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

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

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,不能相信这不是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提供的回调中处理了逻辑,对我来说,这是关闭一个踩踏客户端并清理活动订户列表等