Graphql 订阅不捕获客户端变量
Graphql subscription does not catch client-side variables
我正在尝试使用以下库来使用 graphql 订阅:
服务器端
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;
}),
};
虽然我没有弄清楚如何使用请求中发送的变量,但我的问题已经解决了。
我正在尝试使用以下库来使用 graphql 订阅:
服务器端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;
}),
};
虽然我没有弄清楚如何使用请求中发送的变量,但我的问题已经解决了。