动作电缆仅向客户端发送欢迎和ping消息

时间:2019-08-02 04:56:11

标签: javascript ruby-on-rails websocket redis actioncable

我能够使我的动作电缆正常工作,并且订阅该剧,而不会发生任何戏剧性事件...

现在,我有一个简单的HTML页面,上面带有一些JS,用于连接和记录WebSocket消息。

这是我在HTML页面上正在使用(现在要测试)的脚本

    var socket = new WebSocket('ws://localhost:3000/cable');
    socket.onopen = function(e) {
        console.log("Connection established")
    }
    socket.onclose = function(e) {
        console.log("Error occurred.");
        clients.Remove(socket)  
    }
    socket.onmessage = function(e){
        var server_message = e;
        console.log(server_message);
    }

    JSON.stringify(
        {
            "command": "message",
            "identifier": JSON.stringify({"channel": "tv_channel_1e80f418-08b0-478a-a77c-67a052934433" }),
            "data": {
                "action": "start_broadcasting"
            }
         }  
    ) 

我的rails输出已确认存在订阅,并且我的页面是控制台,其中记录了来自Websocket的ping消息和欢迎消息。

如果我试图通过测试(例如通过控制台或其他方式)广播任何内容

ActionCable.server.broadcast "tv_channel_1e80f418-08b0-478a-a77c-67a052934433", {message: "oh hai"}

它不会被客户接走...

我已通过brew和以下电缆在我的cable.yml文件中全部安装了Redis

development: &development
  adapter: redis
  url: redis://localhost:6379

test:
  adapter: redis
  url: redis://localhost:6379

production:
  adapter: redis
  url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %>
  channel_prefix: can-i-haz-dashboard-server_production

我能够通过redis-cli确认消息正在传递到redis数据库。

我唯一能找到的答案就是安装Redis。

我的connection.rb文件(已编码用于测试的通道)

module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_channel

    def connect
      self.current_channel = ::Channel.find("1e80f418-08b0-478a-a77c-67a052934433")
    end

    private
      def find_channel

      end
  end
end

我的TvChannel.rb

class TvChannel < ApplicationCable::Channel
  def subscribed
    # stream_from "some_channel"
    stream_from "tv_channel_#{current_channel.id}"
    ActionCable.server.broadcast "tv_channel_#{current_channel.id}", 'Test message'
  end

  def unsubscribed
    # Any cleanup needed when channel is unsubscribed
  end

  def start_broadcasting
    "hello"
  end

end

我希望我做错的很简单。任何帮助将不胜感激。


编辑:对不起,不确定我是否足够清楚。我的Rails应用程序仅适用于websocket的API,没有提供服务的视图。 HTML页面是独立的,不在Rails环境中。

1 个答案:

答案 0 :(得分:1)

太好了,我希望这对别人有帮助。

我需要实际发送订阅字符串。

    socket.onopen = function(e) {
        console.log("Connection established")
        socket.send(subscribeString)
    }

    subscribeString = JSON.stringify(
        {
            "command": "subscribe",
            "identifier": JSON.stringify(
                {"channel": "channels:1e80f418-08b0-478a-a77c-67a052934433" }
                 )
        }  
    )