Подписка Graphql не улавливает клиентские переменные

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

person ConductedClever    schedule 27.04.2020    source источник
comment
Мне не понятен ваш комментарий @xadm. Либо если это вопрос что ли. Но в этом случае ...params используется для перехвата всех параметров в качестве метода отладки.   -  person ConductedClever    schedule 27.04.2020
comment
попробовать нормальное определение (value, args, context, info) args?   -  person xadm    schedule 27.04.2020


Ответы (1)


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

новые параметры запроса

А также сервер принимает этот параметр в определении типа подписок. Теперь входные параметры функции фильтра 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;
            }),
        };

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

person ConductedClever    schedule 27.04.2020
comment
... но он не охватывает возможные проверки безопасности (владелец по сравнению с зарегистрированным пользователем - контекст)? - person xadm; 27.04.2020