Ich habe eine einfache node.js-App mit socket.io (1.3.5), die aus socket.io-Beispielen stammt:
%Vor%Nun verbinde ich mich in meinem Front-End wie folgt mit diesen spezifischen Namespaces (wiederum aus dem Beispiel):
%Vor% Die App läuft auf Port 3000 und die Webseite wird mit der URL localhost:3000
geöffnet.
Wenn ich dabei CORS-Fehler bekomme, scheint Socket.io auf der Client-Seite die Port-Nummer nicht automatisch zu erkennen, sobald ich Namespaces benutze (in Firefox-Dev-Tools kann ich sehen, dass Anfragen an localhost/
anstatt an% gehen Code%).
Wenn ich auf meiner Serverseite keine Namespaces verwende:
%Vor%Und am Frontend schließe ich mich an:
%Vor% Alles funktioniert gut, Port Auto-Discovery funktioniert und in Firefox-Dev-Tools kann ich sehen, dass Verbindungen zu localhost:3000/
hergestellt werden.
Alternativ, wenn ich noch Namespaces auf meinem Backend verwende, und am Frontend verbinde ich mich so:
%Vor% Wieder funktioniert alles (und tatsächlich kann ich in den Firefox-Dev-Tools sehen, dass Netzwerkanforderungen zu localhost:3000/
gehen).
Warum funktioniert die automatische Port-Erkennung nicht mit Namespaces? Gibt es eine Möglichkeit, es zum Laufen zu bringen? Fehle ich hier etwas? Vielen Dank.
Siehe meine Antwort unten für eine Reparatur ...
Ok, also habe ich Code in socket.io.js debuggt und festgestellt, dass dort ein potentieller Fehler ist. In Zeile 1050 wird ein loc.hostname anstelle von loc.host verwendet.
Dies führt dazu, dass beim Übergeben eines Namespace ein Hostname verwendet wird, der keine Portnummer enthält.
Wenn kein Namespace verwendet wird, wird in Zeile 1024 loc.host verwendet und alles ist in Ordnung.
Ich habe eine Kopie der Datei genommen und Zeile 1050 geändert, um Host zu verwenden, und alles funktioniert gut.
Found github Problem damit, es ist in 1.4.x behoben:
Ссылка
Ich glaube nicht, dass es eine Möglichkeit gibt, die automatische Port-Erkennung zu aktivieren, ohne den tatsächlichen Socket.io
-Code zu ändern oder auf einen Fix zu warten. Die einfachste Sache, die Sie tun könnten, ist nur die aktuelle location.port
einschließlich eines Doppelpunkts vor Ihrem Namespace einzufügen.
Oder erstellen Sie eine neue Funktion, die einen Socket für Sie erstellt.
%Vor%Tags und Links javascript node.js websocket socket.io