2016-10-23 3 views
4

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.devVerbinden 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?

+0

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

+0

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

+0

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

Antwort

3

Try this:

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

Dann in Ihrer App:

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

Wenn Sie Handshake mit Problemen konfrontiert, gibt es nur wenige Lösungen:

  1. Überprüfen Sie, ob Ihre Frontend App ist kompatibel mit protocol 07 oder neuer.

  2. Überprüfen Sie, ob Ihre Website in config.action_cable.allowed_request_origins ist

  3. hinzufügen config.web_socket_server_url = 'ws://backend.dev/cable' auf Ihre ENV cofig Datei.

  4. Sie können einen schnellen "schmutzigen" Hack verwenden. Fügen Sie einfach auf Ihre ENV cofig Datei folgende:

    config.action_cable.disable_request_forgery_protection = true