Невозможно понять подписки GraphQL с использованием ActionCable с гемом graphql-ruby

Я пытаюсь реализовать подписки GraphQL, используя ActionCable с graphql-ruby gem.

Из этой ссылки я понял, что канал GraphQL нуждается быть созданы, на которые клиенты должны подписаться. Обычно в ActionCable мы будем stream_from требуемый канал в subscribed действии. Но в примере в ссылке указан метод execute с параметром. Когда будет выполнен этот метод?

Кроме того, в документе указано See Apollo Client or Relay Modern для использования клиентом. Обязательно ли использовать какой-либо из них, или я могу использовать coffeescript для подписки и обновления пользовательского интерфейса?


person Shriram Balakrishnan    schedule 23.12.2018    source источник


Ответы (1)


Не уверен, что вы уже решили свою проблему, но для тех, кто не понимает, как GraphQL работает с ActionCable. Я создал репозиторий примеров и постараюсь обновить документы, чтобы они были лучше.

https://github.com/bidluo/GraphQL-ActionCableSubscriptions

Чтобы ответить на ваш вопрос, выполните как любое другое действие ActionCable при отправке сообщений, поэтому для его вызова вы должны сделать следующее, где данные содержат все, а запрос - действительно единственный бит GraphQL.

{
   "command":"message",
   "identifier":"{\"channel\":\"GraphqlChannel\"}",
   "data":"{ \"query\": \"subscription { newMessage { content } }\", \"variables\": null, \"action\": \"execute\" }"
}

Но сначала вам нужно убедиться, что вы подписаны на канал:

{
   "command":"subscribe",
   "identifier":"{\"channel\":\"GraphqlChannel\"}"
}
person David Liaw    schedule 26.06.2019
comment
Привет, Дэвид, это было полезно, но я кое-что заметил. Следуя примеру, если я подпишу N разных потребителей на newMessage, будет запущено N запросов для отправки точно таких же данных. Это очень неэффективно. Вы сталкивались с такой же ситуацией? - person Dario Barrionuevo; 10.02.2021
comment
@DarioBarrionuevo привет, честно говоря, мне это не очень понравилось, поэтому я просто переключил все на использование push-уведомлений. Оказалось немного проще, так как мне нужно было поддерживать только толчок, а не толчок и сокеты. Однако, чтобы ответить на ваш вопрос, вы можете изменить свой канал AC, чтобы кэшировать запрос, а не выполнять новый. - person David Liaw; 02.03.2021
comment
Я спросил об этом разработчика гемов, и повторяющиеся запросы - это ожидаемое поведение для этой настройки. Вместо этого следует использовать широковещательные сообщения GraphQL. - person Dario Barrionuevo; 04.03.2021