Подписка на Graphql не перехватывает переменные на стороне клиента - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь использовать подписки 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.

И Установленная версия библиотеки выглядит следующим образом:

// 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 голосов
/ 27 апреля 2020

Я отказался от использования переменных, так как понял, что могу отправлять такие параметры, как запросы и запросы на мутации. Поэтому я изменил запрос так, чтобы он теперь выполнял такие запросы:

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

Хотя я не понял, как использовать переменные, отправленные в запросе, моя проблема была решена.

...