Я пытаюсь использовать подписки 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;
}),
};
, которая создает некоторые подписки динамически (и ее динамичность не связана с этой проблемой). Теперь два журнала, которые я сделал выше, будут выглядеть так:
параметры подписки: 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"