Ich betreibe eine Rails 5 App als Backend-Server und eine Ember-Anwendung für eine Frontend-Anwendung. Sie sind zwei getrennte Anwendungen auf zwei verschiedenen Domains gehostet - sagen, backend.dev
und frontend.dev
Verbinden von ActionCable mit anderem Host
Die Rails-Anwendung hat eine einfache Verbindungsklasse bei app/channels/application_cable/connection.rb
gefunden, die wie folgt aussieht:
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
ich einen einfachen Basiskanal habe Klasse bei app/channels/application_cable/channel.rb
mit folgendem:
module ApplicationCable
class Channel < ActionCable::Channel::Base
end
end
Und eine einzige Implementierung dieser Klasse bei 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
Auf der Glut Seite der Dinge, verwende ich das Ember-Kabel-Paket. Ich habe mein Setup Verbraucher in meinem Frontend durch die Controller-Klasse mit der Verlängerung folgenden:
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`);
},
ich ziemlich sicher bin, dass meine Verbraucher richtig eingerichtet ist, wie ich einige Debug-Ausgabe zu sehen bin, wenn ich die folgende Ausgabe auf meine js Konsole:
WebSocket connection to 'ws://backend.dev/' failed: Error during WebSocket handshake: Unexpected response code: 200
ich bin nicht s:
DEBUG: EventsChannel#disconnected
Allerdings bin ich auch als auch eine ungerade Fehler in der Konsole zu sehen ure was man von dem Response-Code-Fehler hier machen soll, und da ist absolut nichts in meiner Rails-App eingeloggt. Gibt es etwas Zusätzliches, das ich einrichten muss, damit das Aktionskabel über Domänen hinweg funktioniert? Irgendeine Idee, was der 200-Response-Code hier bedeutet?
Was ist in Ihrem config/routes.rb? Wo mounten Sie ActionCable ('/ cable'?) Es ist möglich, dass Sie einfach Ihren Mount-Punkt zu Ihrem' service.createConsumer' Call hinzufügen müssen - Sie suchen nach etwas wie mount ActionCable.server => '/ cable' 'in routes.rb – Undo
Haben Sie vergessen,' contentSecurityPolicy 'in' config/environment 'einzuschließen.js' für 'connect-src' Attribut wie folgt '' connect-src ':' 'self' ws: //backend.dev/ backend.dev", ' – kumkanillam
danke @Undo und @kumkanillam - ich mounte das ActionCable Server mit 'mount ActionCable.server => '/ cable'' - Anfragen an' backend.dev' geben den Fehler "unerwartete Antwort 200" zurück, während Anfragen an "backend.dev/cable" nur 404s erzeugen. Ich habe auch die 'connect-src' Konfiguration ähnlich wie oben beschrieben. – matt