2017-03-13 6 views
1

Ich versuche, einen WebSocket auf einer my Rails 5-Anwendung zu implementieren.Rails 5 - ActionCable - Fehler beim Aktualisieren auf WebSocket

Hier ist mein Kanal:

class MessagesChannel < ApplicationCable::Channel 
    def subscribed 
    stream_from "messages_#{params[:topic]}" 
    end 
end 

In meinem Controller ich tun:

ActionCable.server.broadcast "messages_#{params[:topic_id]}", 
     message: @message.message, 
     user: current_user.name 

Und meine Verbindungsklasse (Device auch mit):

module ApplicationCable 
    class Connection < ActionCable::Connection::Base 
    identified_by :current_user 

    def connect 
     self.current_user = find_verified_user 
     logger.add_tags 'ActionCable', current_user.email 
    end 

    protected 

    def find_verified_user # this checks whether a user is authenticated with devise 
     if verified_user = env['warden'].user 
     verified_user 
     else 
     reject_unauthorized_connection 
     end 
    end 
    end 
end 

Der Kunde ist ein NodeJS Anwendung nur zu testen:

module.exports.webSocket = function(topic){ 
    const WebSocket = require('ws'); 

    const ws = new WebSocket('ws://localhost:3000/cable'); 

    ws.on('open', function open() { 
    console.log("on open!!"); 
    }); 

    ws.on('message', function incoming(data, flags) { 
    console.log("got here!"); 
    console.log(data); 
    console.log(flags); 
    // flags.binary will be set if a binary data is received. 
    // flags.masked will be set if the data was masked. 
    }); 
}; 

Und das ist, was ich bekommen:

Started GET "/cable" for 127.0.0.1 at 2017-03-13 14:25:01 -0300 
Started GET "/cable/" [WebSocket] for 127.0.0.1 at 2017-03-13 14:25:01 -0300 
Request origin not allowed: 
Failed to upgrade to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket) 
Finished "/cable/" [WebSocket] for 127.0.0.1 at 2017-03-13 14:25:01 -0300 

ich nicht auch wissen, wie den Kanal einstellen, um auf dem NodeJS Client zu hören. Dies wäre auch hilfreich

EDIT 1 - Hinzufügen Versucht folgendes development.rb

config.action_cable.allowed_request_origins = ['http://localhost:3000'] 

EDIT 2 - auch versucht, den Kanal auf dem Node-Client wie folgt ergänzt:

const ws = new WebSocket('ws://localhost:3000/cable', `messages_${topic}`); 

Aber beide Versuche haben nicht funktioniert.

EDIT 3 - Ein anderer Client-Test:

ws.on('open', function open() { 
    console.log("on open!!"); 
    ws.send('{"command":"subscribe","identifier":"{\"channel\":\"MessagesChannel\"}"'); 
    }); 

Antwort

3

Welche Port ist Ihr Client läuft auf? Sie wollen den Kunden ermöglichen, so dass, wenn Schienen auf localhost 3000 läuft, können Sie diese auf die richtige Herkunft URL ändern müssen:

config.action_cable.allowed_request_origins = ['http://localhost:3000'] 

Aus Gründen der Entwicklung, würde ich nur Regex verwenden, um alle Ursprünge für das zu ermöglichen, vorerst:

config.action_cable.allowed_request_origins = [ /http:\/\/.*/, /https:\/\/.*/ ] 

auch die Verbindung leichter zu testen, verwenden Sie diese jsfiddle - die für jetzt Einstellungen auf Ihrem Client eliminiert, um nur anschließen zu können, trainieren zu:

http://jsfiddle.net/BrilliantLa8s/bxkerzf8/2/

Sobald Sie angeschlossen haben, würde ich mit dieser Bibliothek für Ihre Anmeldung zur Aktion Kabelkanal von Ihrem Client empfehlen, die ich davon ausgehen, in JavaScript geschrieben werden, da Sie Knoten

erwähnt https://www.npmjs.com/package/actioncable-js

+0

Was für eine wunderbare Antwort! Also ich habe getestet. Ich bin verbunden. Es klappt. Aber es gibt ein Problem. Ich benutze nodejs, um es zu testen. Aber ich habe einen anderen Client, der reactive-native verwendet (und WebSockets verwendet). Wie kann ich einen Kanal abonnieren, der nur WebSockets verwendet? Oder muss ich eine andere Bibliothek verwenden, um das zu ermöglichen? –

+0

Ein weiterer Hinweis: https://github.com/mwalsher/actioncable-js/blob/master/dist/action_cable.js verwendet Dokument. Und meine Knoten-App läuft nicht im Browser. :( –

Verwandte Themen