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\"}"');
});
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? –
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. :( –