在 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 过滤器
如何在 apollo graphQL 服务器的枚举值中添加特殊字符?