技術

【rails】websocket-rails動きません!

投稿日:

どうも中田です。

巷ではrailsでwebsocketを動かすのは簡単♪簡単♪って言ってたけど、
こと、私に関しては超苦戦しました。。。

 

備忘の為にも残しておきます。

 
 

指示通りにwebsocket-railsを入れて動かしても、クライアントから接続 & メッセージ送信ができない。。

 

railsサーバ側では、websocket_rails.logのログが出てはいるんですが、

[ConnectionManager] Connection opened: #<Connection::b92f9ba0851e100d10be>
...
[ConnectionManager] Connection closed: #<Connection::b92f9ba0851e100d10be>

を繰り返すばかり。。。

そもそも接続要求すら受け付けてくれてないっぽい。
さて、どうしたものか

バージョン依存問題

2015/12/28現在

gem 'websocket-rails'

を追加して、$ bundle installした結果、各バージョンはこのようになってました。

  (略)

    faye-websocket (0.10.2)
      eventmachine (>= 0.12.0)
      websocket-driver (>= 0.5.1)

  (略)

    websocket-driver (0.6.3)
      websocket-extensions (>= 0.1.0)
    websocket-extensions (0.1.2)
    websocket-rails (0.7.0)
      em-synchrony
      faye-websocket
      hiredis
      rack
      rails
      redis
      redis-objects
      thin

  (略)

 

どこぞのサイトでわかったのですが、faye-websocketのバージョンをサゲタマエ!と

    faye-websocket (0.10.2)

↓↓↓↓

    faye-websocket (0.10.0)

 
 

すると、、、クライアントにてコネクションオープンした際のコールバックが呼び出されました!!!
どうやら接続はできたようです。

 

しかし、送信すると、

[Event] Invalid Event Received: WebsocketRails::Event::UnknownDataType
[Event] Event Data: {"event":"websocket_chat","data":{"level":1}}
[Event] WebsocketRails::Event::UnknownDataType: WebsocketRails::Event::UnknownDataType
[Event] /Users/*****/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/websocket-rails-0.7.0/lib/websocket_rails/event.rb:76:in `new_from_json'
...

みたいなエラー発生

 
 

websocket_rails修正

エラーが発生している箇所を確認してみました。

    def self.new_from_json(encoded_data, connection)
      case encoded_data
      when String
        event_name, data = JSON.parse encoded_data

        unless event_name.is_a?(String) && data.is_a?(Hash)
          raise UnknownDataType
        end

        data = data.merge(:connection => connection).with_indifferent_access
        Event.new event_name, data

dataがnilになっちゃってますね。

なので、このように修正してみました。

    def self.new_from_json(encoded_data, connection)
      case encoded_data
      when String
        #event_name, data = JSON.parse encoded_data
        json = JSON.parse encoded_data
        event_name = json["event"]
        data = json

        unless event_name.is_a?(String) && data.is_a?(Hash)
          raise UnknownDataType
        end

        data = data.merge(:connection => connection).with_indifferent_access
        Event.new event_name, data

 
 

これでデータの受信もできました!!

結構時間取られたーーーー(怒)

-技術
-,

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

no image

[Angular]リアクティブフォームのHTML側の記法

Angularのリアクティブフォームではtsファイル側でネストした構成を組むこと …

「Google Inside Music」で自分の好きな音楽を聞いてみる(local環境構築 編)

以前紹介した「Google Inside Music」。 「Google Ins …

no image

【AngularJS】 $on, $emit, $broadcast

どうも、なかたです。 AngularJSのコントローラー(スコープ)間のデータや …

no image

videoタグとIEの話

以前下記のようなコードでvideoの再生が終了したら別な動画をsrcにセットして …

[ Rails ] ExecJS::RubyRacerRuntime is not supported. Please replace therubyracer with mini_racer in your Gemfile or use Node.js as ExecJS runtime.

こんにちは。たなかです。 モバイルアプリ開発の内容でブログを書くことが多い私です …