Socket.io-client: Ungültiger Namespace-Fehler (nur unter Linux Ubuntu)

Erstellt am 13. Okt. 2016  ·  16Kommentare  ·  Quelle: socketio/socket.io-client

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.

Unable to reproduce

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?

Alle 16 Kommentare

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 :-/

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen