Graphql订阅无法捕获客户端变量

时间:2020-04-27 10:31:54

标签: filter graphql graphql-subscriptions

我正在尝试通过以下库使用graphql订阅:

graphql-subscription在服务器端

subscription-transport-ws在客户端

,当不使用过滤机制时,一切都会进行。但是,当我将withFilter函数添加到其中时,会遇到没有变量或上下文对象接收到过滤函数的问题。

例如,我想根据组过滤数据。客户端通过以下查询请求服务器:

request body

在服务器端,已实现的方法如下:

        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"

1 个答案:

答案 0 :(得分:0)

我放弃使用变量,因为我发现可以发送查询和变异请求之类的参数。因此,我更改了请求,以便现在可以进行如下查询:

new query parameters

服务器也接受预订的类型定义中的该参数。现在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;
            }),
        };

尽管我没有弄清楚如何利用请求中发送的变量,但我的问题得到了解决。