【问题标题】:Action Cable error Could not execute command from...RuntimeError - Unable to find subscription with identifier操作电缆错误无法执行来自...的命令 RuntimeError - 无法找到带有标识符的订阅
【发布时间】:2018-06-06 09:45:14
【问题描述】:

我在向 Action Cable 频道“UsersChannel”进行上行调用时遇到了错误。这是完整的错误信息:

无法执行来自 ({"command"=>"message", "identifier"=>"{\"channel\":\"UsersChannel\"}", "data"=>"{\"id \":\"1\",\"action\":\"show\"}"}) [RuntimeError - 无法找到带有标识符的订阅:{"channel":"UsersChannel"}]: /Users/robskrob/ .rvm/gems/ruby-2.4.1/gems/actioncable-5.1.4/lib/action_cable/connection/subscriptions.rb:76:in find' | /Users/robskrob/.rvm/gems/ruby-2.4.1/gems/actioncable-5.1.4/lib/action_cable/connection/subscriptions.rb:53:inperform_action' | /Users/robskrob/.rvm/gems/ruby-2.4.1/gems/actioncable-5.1.4/lib/action_cable/connection/subscriptions.rb:17:in execute_command' | /Users/robskrob/.rvm/gems/ruby-2.4.1/gems/actioncable-5.1.4/lib/action_cable/connection/base.rb:85:indispatch_websocket_message' | /Users/robskrob/.rvm/gems/ruby-2.4.1/gems/actioncable-5.1.4/lib/action_cable/server/worker.rb:58:in `block in invoke'

这很奇怪,因为在same file我成功使用订阅频道执行上游创建用户(usersChannel.perform('create', {...}))。当我对用于创建用户的同一个订阅者进行不同的调用时,为什么会看到上述错误?之前调用UsersChannel#create 时,它能够找到UsersChannel 订阅。为什么前端用usersChannel.perform('show', {...})调用UsersChannel#show会报这个错误?

【问题讨论】:

    标签: javascript reactjs redux ruby-on-rails-5 actioncable


    【解决方案1】:

    我通过创建 HTTP REST 客户端向用户发出请求来解决了这个问题。换句话说,当浏览器中的路由为localhost:3000/user/1时,导出的动作loadUser向服务器发出RESTful请求,响应包含用户数据,这就是我在上述路由时需要应用程序做的事情画出来了。

    我的原始方法的问题如下:在我同时进行上游调用以获取用户并建立与UsersChannel 的连接的文件中,获取用户的调用发生在实际连接之前服务器和客户端之间建立,关于UsersChannel。在 actioncable 可以成功进行任何上游调用之前,必须首先发生以下情况:“UsersChannel 正在从 users_channel 流式传输”。

    简而言之,我的应用在建立流之前通过创建订阅执行上游,因此调用服务器 UsersChannel#show 无法成功。我想您可以将我遇到的问题的根源称为竞争条件:上游调用击败了客户端和服务器之间连接流的建立。

    经验教训:当客户端需要在整个页面重新加载时接收数据时使用 HTTP。通过 actioncable 的调用可能没有在客户端和服务器之间建立流以使上游调用成功。

    【讨论】:

      【解决方案2】:

      就我而言,两个流媒体频道之间会出现竞争条件。我确实通过添加

      解决了这个问题
      stop_all_streams
      

      每当调用“取消订阅”方法时。

       def unsubscribed
         #Unsubscribes all streams associated with this channel from the pubsub queue.
          stop_all_streams
       end
      

      【讨论】:

        猜你喜欢
        • 2018-11-03
        • 2019-10-28
        • 1970-01-01
        • 2020-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多