Graphql 订阅不捕获客户端变量

Graphql subscription does not catch client-side variables

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

服务器端

graphql-subscription

subscription-transport-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;
            }),
        };

它正在动态创建一些订阅(并且它的动态性与此问题无关)。现在我上面做的两条日志如下:

subscription params: null {} null null

filtering params: { 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"

我已经放弃使用变量,因为我发现我可以发送查询和变更请求等参数。所以我更改了请求,以便它现在可以进行如下查询:

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

虽然我没有弄清楚如何使用请求中发送的变量,但我的问题已经解决了。