我正在尝试通过以下库使用graphql订阅:
graphql-subscription在服务器端
,当不使用过滤机制时,一切都会进行。但是,当我将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;
}),
};
正在动态创建一些订阅(其动态与该问题无关)。现在,我在上面制作的两个日志如下:
订阅参数:
null {} null null
过滤参数:
{ message_onMessage: { text: 'test', _offline_id: '1587981902663', _status: 3, time: 1587981902713, _id: 1587981902716, _rev: 1587981902716 } } {} null null
因此,在传递给用于过滤数据的withFilter
函数的回调中,我没有变量对象和上下文对象来获取请求者的_group
参数。 / p>
并且库的安装版本如下:
// 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"
答案 0 :(得分:0)
我放弃使用变量,因为我发现可以发送查询和变异请求之类的参数。因此,我更改了请求,以便现在可以进行如下查询:
服务器也接受预订的类型定义中的该参数。现在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;
}),
};
尽管我没有弄清楚如何利用请求中发送的变量,但我的问题得到了解决。