Ich habe ein NodeJS-Skript, das auf einem Gerät ausgeführt werden soll, und eine App auf einem Server. Ich möchte das Gerät mit dem /device
Namespace auf dem Server verbinden. Das funktioniert unter Windows einwandfrei. Unter Ubuntu verbindet sich das Gerät jedoch einfach nie. Die Übergabe einer DEBUG-env-Variablen ergibt diese Ausgabe:
socket.io-client:url parse http://localhost:3000/device +0ms
socket.io-client new io instance for http://localhost:3000/device +7ms
socket.io-client:manager readyState closed +5ms
socket.io-client:manager opening http://localhost:3000/device +0ms
engine.io-client:socket creating transport "websocket" +3ms
engine.io-client:socket setting transport websocket +47ms
socket.io-client:manager connect attempt will timeout after 20000 +2ms
socket.io-client:manager readyState opening +4ms
engine.io-client:socket socket receive: type "open", data "{"sid":"oYxMG7iQuy2Rp7LWAAAN","upgrades":[],"pingInterval":25000,"pingTimeout":60000}" +51ms
engine.io-client:socket socket open +1ms
socket.io-client:manager open +1ms
socket.io-client:manager cleanup +1ms
socket.io-client:socket transport is open - connecting +1ms
socket.io-client:manager writing packet {"type":0,"query":"deviceId=123456789abcdef","nsp":"/device"} +1ms
socket.io-parser encoding packet {"type":0,"query":"deviceId=123456789abcdef","nsp":"/device?deviceId=123456789abcdef"} +0ms
socket.io-parser encoded {"type":0,"query":"deviceId=123456789abcdef","nsp":"/device?deviceId=123456789abcdef"} as 0/device?deviceId=123456789abcdef +1ms
engine.io-client:socket flushing 1 packets in socket +1ms
engine.io-client:socket socket receive: type "message", data "0" +14ms
socket.io-parser decoded 0 as {"type":0,"nsp":"/"} +2ms
engine.io-client:socket socket receive: type "message", data "4/device?deviceId=123456789abcdef,"Invalid namespace"" +3ms
socket.io-parser decoded 4/device?deviceId=123456789abcdef,"Invalid namespace" as {"type":4,"nsp":"/device?deviceId=123456789abcdef","data":"Invalid namespace"} +2ms
Dh der Namespace scheint ungültig zu sein. Ich habe keine Ahnung warum, da dieser Code unter Windows perfekt läuft.
Mein Gerätecode (Client):
const socket = io.connect('http://localhost:3000/device', {
transports: ['websocket'],
secure: true,
query: { deviceId: '123456789abcdef' }
});
socket.on('connect', function() {
console.log('Connection to server established');
})
Mein Servercode:
const device = io.of('/device'),
portal = io.of('/portal');
device.on('connection', function(socket) {
console.log('Connection made');
})
Alle Ideen wären nützlich.
Das ist mir auch in socket.io-client
Version 1.5.0 aufgefallen. Es scheint, dass aus irgendeinem Grund der Wert von opts.query
an den Namespace-Namen angehängt wird, was den Fehler "Ungültiger Namespace" verursacht.
Beispiel:
io.connect("/hello", {
query: "foo=bar"
})
Es sollte sich mit dem Namespace /hello
aber stattdessen versucht es, sich mit dem Namespace /hello?foo=bar
.
Ich habe es in 1.4.8 getestet und es gibt keinen Fehler, also wurde dieser Fehler später irgendwo eingeführt. (Außerdem glaube ich nicht, dass dieser Fehler speziell mit Ubuntu zusammenhängt, da ich ihn unter Win7 und Mint Rosa reproduzieren kann.)
Ah ok das macht Sinn. Hm. Habt ihr Ideen für Abhilfe, oder wo im Repo sollte ich suchen, wenn ich das beheben möchte?
Keine Ahnung, wie man das beheben kann, aber Sie könnten auf [email protected]
downgraden, wenn dieser Fehler nicht existiert, das habe ich sowieso getan.
Das könnte mit https://github.com/socketio/socket.io-client/pull/943 (und https://github.com/socketio/socket.io/pull/2422) verlinkt sein.
Ich habe es auf v1.4.8 getestet und es hat wie erwartet funktioniert. Dann habe ich es mit v1.5 nur auf dem Client getestet und es funktionierte nicht mehr. Die Installation von v1.5 auf dem Server _und_ Client hat das Problem jedoch behoben.
Es sieht also so aus, als würde der Fehler nur auftreten, wenn zwischen Client und Server ein Versionskonflikt besteht, aber nicht, wenn beide dieselbe Version haben, egal ob diese höher oder niedriger ist als v1.5.
@Arrow7000 könnten Sie bitte überprüfen, ob 1.6.0 Ihr Problem behebt?
Ich habe dieses Problem immer noch mit v1.7.2
@stgogm verwenden Sie 1.7.2 sowohl auf dem Client als auch auf dem Server? Ist das genau das gleiche Problem?
@darrachequesne Ja, das bin ich. Und der Fehler ist der gleiche: Es versucht beispielsweise eine Verbindung zu /namespace?q=value
herzustellen, anstatt sich mit /namespace
und q
als Abfrageparameter zu übergeben.
@stgogm können Sie bitte einen fehlgeschlagenen Testfall bereitstellen? Ich kann anscheinend nicht reproduzieren: https://github.com/darrachequesne/socket.io-fiddle/tree/issue/invalid-namespace
@darrachequesne Der Fehler ist effektiv
Ich habe das gleiche Problem, bei dem es in der Clientversion 1.4.8 funktioniert, aber in 1.5.1 fehlschlägt. (Ich verwende eine ältere Socket.io-Serverversion) Bedeutet dies, dass die Client- und Serverversion von socket.io immer übereinstimmen sollten? Ist das irgendwo angegeben?
Ich verwende 1.7.3 und der Fehler ist immer noch da. Ein Downgrade auf 1.4.8 hat geholfen, aber die Funktion emit
scheint anders zu funktionieren. Gibt es Fortschritte bei der Behebung dieses Problems in 1.7.3?
Ich bin gerade auf etwas Ähnliches gestoßen. Allerdings ohne Abfragezeichenfolgen. Ich rufe einfach io([path])
mit path === "activities"
.
Ich habe eine Ansicht in meiner App, die zwei Namespace-Sockets herstellt, "/visits" und "/activities" ... der Socket "/visits" lässt sich gut verbinden. Ich sehe die Meldung "Ungültiger Namespace", wenn ich versuche, eine Verbindung zum Namespace "/activities" herzustellen.
Nicht sicher, warum es das tut. Ich folge dem gleichen Muster für eine andere Ansicht, die "/homes" und "/visits" verwendet, und beide Sockets sind in dieser Ansicht gut eingerichtet.
@RavenHursT ist der Namespace activities
richtig erstellt? (mit io.of('/activities');
)? Könntest du das Problem mit der Geige hier reproduzieren?
Yeah... mah schlecht.. Ich hatte vergessen, den Namespace serverseitig hinzuzufügen und vergessen, hier zu aktualisieren. Ignorieren Sie bitte :-/
Hilfreichster Kommentar
Ich verwende 1.7.3 und der Fehler ist immer noch da. Ein Downgrade auf 1.4.8 hat geholfen, aber die Funktion
emit
scheint anders zu funktionieren. Gibt es Fortschritte bei der Behebung dieses Problems in 1.7.3?