2017-12-24 12 views
1
のサブスクリプションが見つかりません

アクションケーブルチャンネル 'UsersChannel'のアップストリームを実行するときにエラーが発生しました。アクションケーブルエラーコマンドを実行できませんでした... RuntimeError - 識別子が

( "コマンド" = "メッセージ"、 "識別子" => "{\"チャネル\ ":\"ユーザーチャネル\ "}"、 "データからコマンドを実行できませんでした。 [RuntimeError - 識別子が{"channel": "UsersChannel"のサブスクリプションを見つけることができません。 "=" "{\" id \ ":\" 1 \ "、\" action \ ":\" }]:/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 'ブロックイン呼び出し'

これは非常に奇妙ですsame fileでは、ユーザを作成するためにアップストリームを実行するために購読チャネルを首尾よく使用しているからです(usersChannel.perform('create', {...}))。ユーザーを作成するのに使用した同じ加入者で別の電話をかけたときに、上記のエラーが表示されるのはなぜですか? UsersChannel#createを呼び出すと、以前にUsersChannelサブスクリプションが見つかりました。フロントエンドにusersChannel.perform('show', {...})UsersChannel#showを呼び出すときにこのエラーが発生するのはなぜですか?

答えて

0

この問題は、HTTP RESTクライアントを作成してユーザーに要求することで解決しました。つまり、ブラウザのルートがlocalhost:3000/user/1の場合、エクスポートされたアクションloadUserは、サーバーにRustful要求をユーザーデータを含む応答にします。これは、上記のルートが描画されたときにアプリケーションが必要とするものです。

私の元のアプローチの問題は次のとおりです。私は同時に、ユーザを取得し、UsersChannelへの接続を確立するためにアップストリームコールを行うファイルで、実際の接続サーバーとクライアントはUsersChannelに関して確立されます。 actioncableが正常にアップストリームコールを行うには、まず「UsersChannelがusers_channelからストリーミングしています」という次の処理が必要です。

要するに、私のアプリは、ストリームが確立される前に作成サブスクリプションでアップストリームで実行していたので、サーバーへの呼び出しが成功することができませんでした(UsersChannel#show)。私はあなたが経験した問題の根本を競争条件と呼ぶことができたと思います。上流の呼び出しは、クライアントとサーバーの間の接続されたストリームの確立を打ち負かします。

教訓:クライアントが全面的なページの再読み込み時にデータを受信する必要がある場合は、HTTPを使用します。 actioncableによる呼び出しでは、上流の呼び出しが成功するためにクライアントとサーバーの間にストリームが確立されていない可能性があります。

関連する問題