GraphQL: как опубликовать подписку на запланированное задание по повестке дня - PullRequest
0 голосов
/ 24 октября 2019

Мой вопрос также задают Активируйте подписку Apollo позже с Agenda , но ответа нет, и у меня недостаточно репутации, чтобы комментировать там. Я не был уверен, что делать, поэтому я отправляю новый вопрос.

Я работаю с graphql-yoga и использую pubsub для запуска подписок. У меня есть мутация, которая получает pubsub в качестве аргумента контекста. Оттуда я могу опубликовать свою подписку через pubsub.publish. Это работает нормально.

Я также планирую задания по повестке дня (https://github.com/agenda/agenda). Когда эти задания запускаются позже, я обновляю базу данных. Это также работает.

Моя проблема в том, чтокогда я обновляю базу данных в задании по повестке дня, мне также необходимо публиковать обновления базы данных для подписок. Я не знаю, как получить доступ к pubsub в своей функции повестки дня.

Я попытался включить свой объект pubsub, который яуже в мутации с данными, которые я доставляю на работу, в надежде, что я смогу получить доступ к pubsub позже. Но это не работает (неудивительно).

Я не могу найти какую-либо документацию, иу аналогичного вопроса стекового потока, который я обнаружил (ссылка выше), нет ответов.

Кто-нибудь знает, возможно ли инициировать подписку из задания повестки дня?

1 Ответ

0 голосов
/ 28 октября 2019

Я не знаком с agenda, но подозреваю, что он запускает задания в процессе, отдельном от вашего сервера GraphQL. Реализация PubSub по умолчанию просто использует EventEmitter , и это не будет работать в нескольких процессах. Таким образом, вы должны использовать реализацию, которая будет где-то сохранять подписки, например, базу данных, хранилище значений ключей, очередь сообщений и т. Д. Создайте модуль и экспортируйте экземпляр PubSub:

// pubsub.js

const { RedisPubSub } = require('graphql-redis-subscriptions')
const Redis = require('ioredis')

const options = {
  // redis client options
};

module.exports = new RedisPubSub({
  publisher: new Redis(options),
  subscriber: new Redis(options)
})

Затем вы можетепросто импортируйте этот модуль как в ваши решатели GraphQL, так и в ваши задания, и при необходимости вызывайте publish и subscribe.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...