我正在运行rails 5应用程序作为后端服务器,以及用于前端应用程序的ember应用程序。它们是托管在两个不同域上的两个独立应用程序 - 例如backend.dev
和frontend.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响应代码在这里意味着什么?
答案 0 :(得分:3)
试试这个:
# routes.rb
Rails.application.routes.draw do
# your code
mount ActionCable.server => '/cable'
end
然后在你的应用中:
let consumer = service.createConsumer(`ws://backend.dev/cable`);
如果您遇到握手问题,解决方案很少:
检查您的前端应用是否与protocol 07
或更新版本兼容。
检查您的网站是否在config.action_cable.allowed_request_origins
将config.web_socket_server_url = 'ws://backend.dev/cable'
添加到您的ENV cofig文件中。
你可以使用快速&#34;脏&#34;黑客攻击。只需在ENV cofig文件中添加以下内容:
config.action_cable.disable_request_forgery_protection = true