技術

【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 を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

Siriに笑って欲しいから [iOS 11、macOS High Sierra](「Siri」の笑い声まとめ)

iPhone Xが発売されて巷はiPhone Xの記事ばかり。 なんとなく見てい …

no image

[Angular] router-outletの外で現在のurlを取得

こんにちは、コーテッグのこやまです。 Angularでapp.component …

no image

HTMLタグだけでアコーディオンを実装する

こんにちは htmlタグのdetailsというのは知っていますか? 僕も初めて知 …

[正規表現]半角英数字&記号

どうも中田です。 今更ですが、正規表現の話。 正規表現でこんなパターンがほしい的 …

no image

【Rails】deviseを日本語化する

こんばんは railsでログイン機能を作る時にdeviseを使う方は多いのではな …