首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用graphql-ruby订阅进行简单广播

无法使用graphql-ruby订阅进行简单广播
EN

Stack Overflow用户
提问于 2020-10-04 16:48:50
回答 2查看 931关注 0票数 2

我有一个基本的设置,更新广播与图形for红宝石行动电缆.

  • 客户端在订阅罚款时接收初始有效载荷。
  • 客户端没有收到任何更新,也没有调用订阅类型的update方法。后端没有错误。触发呼叫似乎被默默地忽略了。这就是我想要解决的问题/正确理解它应该如何工作。

我在看的医生:

订阅类型:

代码语言:javascript
复制
module Types
  class SubscriptionType < Types::BaseObject
    field :server_info, subscription: Subscriptions::ServerInfoSubscription, null: false
  end
end
代码语言:javascript
复制
module Subscriptions
  class ServerInfoSubscription < Subscriptions::BaseSubscription
    field :date_time, GraphQL::Types::ISO8601DateTime, null: false

    def subscribe
      { date_time: DateTime.now }
    end

    def update
      puts 'UPDATE CALLED' # Nope, it's not being called
      super
    end
  end
end

我试图触发更新的方式:

代码语言:javascript
复制
MySchema.subscriptions.trigger(:server_info, {}, { date_time: DateTime.now })

模式被定义为:

代码语言:javascript
复制
class MySchema < GraphQL::Schema
  use GraphQL::Execution::Interpreter
  use GraphQL::Subscriptions::ActionCableSubscriptions

  subscription(Types::SubscriptionType)
end

我在config/Cable.yml中为开发环境使用redis适配器:

代码语言:javascript
复制
development:
  adapter: redis
  url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %>
  channel_prefix: test-app_development

我遗漏了什么?有什么故障排除提示吗?

更新:

一些诊断:

Rails记录初始(成功)订阅调用的日志:

代码语言:javascript
复制
GraphqlChannel#execute({"query"=>"subscription ServerInfoSubscription {\n  serverInfo {\n    dateTime\n    __typename\n  }\n}\n", "variables"=>{}, "operationName"=>"ServerInfoSubscription"})
GraphqlChannel transmitting {"data"=>{"serverInfo"=>{"dateTime"=>"2020-10-08T10:47:08-04:00", "__typename"=>"ServerInfoSubscriptionPayload"}}}
GraphqlChannel is streaming from graphql-subscription:9087735b-9b99-4d66-8b77-ff3622c8efe7
GraphqlChannel is streaming from graphql-event::dateTime:
Started POST "/graphql" for 192.168.64.210 at 2020-10-08 10:47:08 -0400

检查活动的Redis PubSub频道:

代码语言:javascript
复制
$ redis-cli -h 192.168.64.210 -p 6379 pubsub channels
1) "test-app_development:graphql-subscription:9087735b-9b99-4d66-8b77-ff3622c8efe7"
2) "test-app_development:graphql-event::dateTime:"
3) "_action_cable_internal"

在Rails控制台中运行触发器调用的结果:

代码语言:javascript
复制
irb(main):001:0> MySchema.subscriptions.trigger(:server_info, {}, { date_time: DateTime.now })
[ActionCable] Broadcasting to graphql-event::serverInfo:: "{\"date_time\":\"2020-10-08T10:54:18-04:00\",\"__sym_keys__\":[\"date_time\"]}"

最明显的是,Redis PubSub通道名为“graphql-Event:dateTime:”,而触发器调用则在不存在的"graphql-event::serverInfo:“通道上广播。我不明白为什么实际的Redis通道被称为"graphql-event::dateTime“,而订阅查询位于顶级"ServerInfo”类型。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-02 13:24:49

我终于让它起作用了,但我找不出为什么它不起作用:

代码语言:javascript
复制
MySchema.subscriptions.trigger(:server_info, {}, { date_time: DateTime.now })

注意,我一直在传递一个空哈希({})作为第二个参数。

我让它工作的方法是向我的查询中添加一个argument并使用一个匹配的参数(与原始的订阅查询匹配)。就像这样:

代码语言:javascript
复制
module Subscriptions
  class EventReceivedSubscription < Subscriptions::BaseSubscription
    argument :event_name, String, required: true

    field :event_name, String, null: false
    field :payload, String, null: true
  end
end
代码语言:javascript
复制
MySchema.subscriptions.trigger(
  :event_received,
  { event_name: 'greeting' },
  { payload: 'Hello' }
)

我现在可以看到的Redis频道是:

代码语言:javascript
复制
$ redis-cli -h 192.168.64.210 -p 6379 pubsub channels
1) "test-app_development:graphql-event::eventReceived:eventName:greeting"
票数 3
EN

Stack Overflow用户

发布于 2022-01-19 13:50:34

这是因为如果您查看GraphQL::Schema::Subscription,您试图覆盖的方法是期望参数

代码语言:javascript
复制
def subscribe( attrs = {})
...
end

def update( attrs = {} )
...
end

您可以安全地删除:argument并使用参数定义您的更新方法,这将解决这个问题。

代码语言:javascript
复制
def update( _attrs = {} )
  # your logic here
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64197327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档