在拨打执行有线电视频道“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:in
perform_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:in
dispatch_websocket_message'| /Users/robskrob/.rvm/gems/ruby-2.4.1/gems/actioncable-5.1.4/lib/action_cable/server/worker.rb:58:in`clock in invoke'
这非常离奇,因为在same file我成功使用订阅频道执行上游来创建用户(usersChannel.perform('create', {...})
)。当我在用于创建用户的同一订户上进行不同的呼叫时,为什么会看到上述错误?在调用UsersChannel
时,它能够先找到UsersChannel#create
订阅。为什么在前端使用UsersChannel#show
调用usersChannel.perform('show', {...})
时会抛出此错误?
答案 0 :(得分:1)
我通过创建HTTP REST客户端来为用户发出请求来解决这个问题。换句话说,当浏览器中的路由为localhost:3000/user/1
时,导出的操作loadUser
向服务器发出RESTful请求,指向包含用户数据的响应,这就是我需要应用程序执行的操作当绘制上述路线时。
我原来的方法存在的问题如下:在文件中,我同时进行上游调用以获取用户并建立与UsersChannel
的连接,以便在用户之前进行调用关于UsersChannel
,建立了服务器和客户端之间的实际连接。在actioncable可以成功进行任何上游呼叫之前,必须首先进行以下操作:" UsersChannel从users_channel"流式传输。
简而言之,我的应用程序在建立流之前使用create subscription执行上游,因此呼叫服务器UsersChannel#show
无法成功。我想你可以调用我遇到的问题的根源,一个竞争条件:上游呼叫击败了在客户端和服务器之间建立连接流。
获得的经验:当客户端需要在整页重新加载时接收数据时使用HTTP。通过actioncable进行的呼叫可能没有在客户端和服务器之间建立流以使上游呼叫成功。
答案 1 :(得分:0)
就我而言,竞争条件出现在两个流媒体频道之间。我确实通过添加
解决了此问题stop_all_streams
调用“取消订阅”方法时。
def unsubscribed
#Unsubscribes all streams associated with this channel from the pubsub queue.
stop_all_streams
end