Я запускаю приложение rails 5 в качестве серверного сервера и приложение ember для внешнего приложения. Они два отдельных приложений, размещенных на двух разных доменах - скажем, backend.dev
и frontend.dev
Подключение ActionCable к другому хосту
Применение Рельсы имеет простой класс соединений найдено в 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
Я не s что делать с ошибкой кода ответа здесь, и абсолютно ничего не регистрируется в моем приложении rails. Есть ли что-то еще, что мне нужно для настройки работы с действиями по доменам? Любая идея о том, что здесь означает код ответа 200?
Что в вашей конфигурации/routes.rb? Где вы устанавливаете ActionCable ('/ cable'?) Возможно, вам просто нужно добавить точку монтирования в ваш вызов' service.createConsumer' - вы ищете что-то вроде «mount ActionCable.server => '/ cable' 'в routes.rb – Undo
Вы забыли включить' contentSecurityPolicy' в 'config/environment.js' для атрибута 'connect-src', как этот' 'connect-src ':' 'self' ws: //backend.dev/ backend.dev", ' – kumkanillam
thanks @Undo и @kumkanillam - я монтирую ActionCable сервер с помощью 'mount ActionCable.server => '/ cable'' - запросы на« backend.dev »возвращают ошибку« неожиданного ответа 200 », тогда как запросы на« backend.dev/cable »просто производят 404s. У меня также есть конфигурация конфигурации 'connect-src' аналогично вышеприведенному комментарию. – matt