将ActionCable连接到不同的主机

时间:2016-10-23 17:02:51

标签: ruby-on-rails ember.js actioncable

我正在运行rails 5应用程序作为后端服务器,以及用于前端应用程序的ember应用程序。它们是托管在两个不同域上的两个独立应用程序 - 例如backend.devfrontend.dev

rails应用程序在app/channels/application_cable/connection.rb处有一个简单的连接类,如下所示:

module ApplicationCable
  class Connection < ActionCable::Connection::Base
    def connect
      Rails.logger.debug("env: #{env.inspect}")
      Rails.logger.info("cookies.signed: #{cookies.signed.inspect}")
    end
  end
end

我在app/channels/application_cable/channel.rb有一个简单的基本频道类,其中包含以下内容:

module ApplicationCable
  class Channel < ActionCable::Channel::Base
  end
end

app/channels/events_channel.rb处的该课程的单一实施:

class EventsChannel < ApplicationCable::Channel
  def subscribed
    Rails.logger.debug("env: #{env.inspect}")
    Rails.logger.info("cookies.signed: #{cookies.signed.inspect}")
    stream_from 'events'
  end
end

在余烬方面,我正在使用ember-cable软件包。我通过扩展控制器类使用以下内容在我的前端设置我的消费者:

cableService: Ember.inject.service('cable'),

setupConsumer: Ember.on('init', function() {
  let service = this.get('cableService');
  let consumer = service.createConsumer(`ws://backend.dev`);
  let channel = 'EventsChannel';

  consumer.subscriptions.create(channel, {
    disconnected() {
      Ember.debug(`${channel}#disconnected`);
    },

    connected() {
      Ember.debug(`${channel}#connected`);
    },

我很确定我的消费者设置正确,因为当我将以下输出发送到我的js控制台时,我看到一些调试输出:

DEBUG: EventsChannel#disconnected

但是,我也在控制台中看到一个奇怪的错误:

WebSocket connection to 'ws://backend.dev/' failed: Error during WebSocket handshake: Unexpected response code: 200

我不知道这里的响应代码错误是什么,并且我的rails应用程序中绝对没有记录任何内容。我还需要设置哪些其他功能才能跨域运行actioncable吗?想知道200响应代码在这里意味着什么?

1 个答案:

答案 0 :(得分:3)

试试这个:

# routes.rb
Rails.application.routes.draw do
  # your code
  mount ActionCable.server => '/cable'
end

然后在你的应用中:

let consumer = service.createConsumer(`ws://backend.dev/cable`);

如果您遇到握手问题,解决方案很少:

  1. 检查您的前端应用是否与protocol 07或更新版本兼容。

  2. 检查您的网站是否在config.action_cable.allowed_request_origins

  3. config.web_socket_server_url = 'ws://backend.dev/cable'添加到您的ENV cofig文件中。

  4. 你可以使用快速&#34;脏&#34;黑客攻击。只需在ENV cofig文件中添加以下内容:

    config.action_cable.disable_request_forgery_protection = true