我试图使用以下库使用graphql订阅:
服务器端的graphql-订阅
客户端的订阅-传输-ws
当不使用过滤机制时,每件事都是正确的。但是,当我将withFilter函数添加到其中时,会遇到一个问题,即筛选函数中没有任何变量或上下文对象接收到它。
例如,我想根据组过滤数据。客户端使用以下查询请求服务器:

在服务器端,实现的方法如下:
this.resolvers.Subscription[subscription.name] = {
subscribe: withFilter((...params) => {console.log('subscription params: ', ...params); return this.pubsub.asyncIterator(subscription.name.toUpperCase());}, (...params) => {
console.log('filtering params: ', ...params)
return true // payload[subscription.name]._group === variables._group;
}),
};它动态地创建一些订阅(它的动态性与此问题无关)。现在,我上面所做的两条日志如下:
订阅params:
null {} null null过滤参数:{ message_onMessage: { text: 'test', _offline_id: '1587981902663', _status: 3, time: 1587981902713, _id: 1587981902716, _rev: 1587981902716 } } {} null null
因此,在传递给用于筛选数据的withFilter函数的回调中,我没有变量对象和上下文对象来获取请求者_group参数。
库的安装版本如下所示:
// server
"graphql": "^14.6.0",
"graphql-subscriptions": "^1.1.0",
// client
"graphql": "^15.0.0",
"graphql-tag": "^2.10.3",
"subscriptions-transport-ws": "^0.9.16"发布于 2020-04-27 14:31:38
我已经放弃使用变量,因为我知道我可以发送查询和变异请求之类的参数。因此,我更改了请求,以便它现在进行如下查询:

服务器还接受订阅类型定义中的该参数。现在,withFilter过滤器函数(第二次回调)的输入参数是有效载荷和变量,它们分别是由突变发布的数据和从用户检索的数据。
因此,根据上述要求,当前的功能工作非常完善:
this.resolvers.Subscription[subscription.name] = {
subscribe: withFilter(_ => this.pubsub.asyncIterator(subscription.name.toUpperCase()), (payload, variables) => {
console.log(payload, variables);
return payload[subscription.name]._group === variables._group;
}),
};虽然我不知道如何使用在请求中发送的变量,但我的问题得到了解决。
https://stackoverflow.com/questions/61456825
复制相似问题