Socket.io-client: Error de espacio de nombres no válido (solo en Linux Ubuntu)

Creado en 13 oct. 2016  ·  16Comentarios  ·  Fuente: socketio/socket.io-client

Tengo un script NodeJS destinado a ejecutarse en un dispositivo y una aplicación en un servidor. Quiero conectar el dispositivo al espacio de nombres /device en el servidor. Esto funciona perfectamente en Windows. En Ubuntu, sin embargo, el dispositivo nunca se conecta. Pasar una variable env DEBUG da esta salida:

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

Es decir, el espacio de nombres parece no ser válido. No tengo idea de por qué, ya que este código se ejecuta perfectamente en Windows.
Código de mi dispositivo (cliente):

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');
})

Mi código de servidor:

  const device = io.of('/device'),
      portal = io.of('/portal');

  device.on('connection', function(socket) {
      console.log('Connection made');
  })

Cualquier idea sería útil.

Unable to reproduce

Comentario más útil

Estoy usando 1.7.3 y el error sigue ahí. La degradación a 1.4.8 ayudó, pero la función emit parece funcionar de manera diferente. ¿Hay algún progreso para solucionar este problema en 1.7.3?

Todos 16 comentarios

También me di cuenta de esto en socket.io-client versión 1.5.0. Parece que, por alguna razón, el valor de opts.query se agrega al nombre de los espacios de nombres, lo que provoca el error "Espacio de nombres no válido".

ejemplo:

io.connect("/hello", {
  query: "foo=bar"
})

Debería conectarse al espacio de nombres /hello pero, en su lugar, intenta conectarse al espacio de nombres /hello?foo=bar .

Lo probé en 1.4.8 y no hay ningún error, por lo que este error se introdujo en algún lugar después de eso. (Además, no creo que este error esté relacionado con Ubuntu específicamente porque puedo reproducirlo en Win7 y Mint Rosa).

Ah, vale, eso tiene sentido. Hm. ¿Tiene alguna idea para un remedio, o en qué parte del repositorio debería buscar si quiero solucionar este problema?

No tengo idea de cómo solucionar este problema, pero podría cambiar a [email protected] donde este error no existe, eso es lo que hice de todos modos.

Eso podría estar vinculado a https://github.com/socketio/socket.io-client/pull/943 (y https://github.com/socketio/socket.io/pull/2422)

Lo probé en v1.4.8 y funcionó como se esperaba. Luego lo probé con v1.5 solo en el cliente y dejó de funcionar. Sin embargo, la instalación de v1.5 en el servidor _y_ cliente solucionó el problema.

Entonces, parece que el error solo ocurre cuando hay una discrepancia de versión entre el cliente y el servidor, pero no cuando ambos tienen la misma versión, ya sea por encima o por debajo de la v1.5.

@ Arrow7000, ¿ podría comprobar si 1.6.0 soluciona su problema?

Sigo teniendo este problema con v1.7.2

@stgogm, ¿está utilizando 1.7.2 tanto en el cliente como en el servidor? ¿Es exactamente el mismo problema?

@darrachequesne Sí, lo soy. Y el error es el mismo: intenta conectarse a /namespace?q=value , por ejemplo, en lugar de conectarse a /namespace y pasar q como parámetro de consulta.

@stgogm , ¿puede proporcionar un caso de prueba fallido? Parece que no puedo reproducir: https://github.com/darrachequesne/socket.io-fiddle/tree/issue/invalid-namespace

@darrachequesne Efectivamente, el error desapareció. Quizás el backend no se actualizó en ese momento. Perdón por el informe equivocado y gracias por tu tiempo.

Tengo el mismo problema, donde funciona en la versión de cliente 1.4.8 pero falla en 1.5.1. (Estoy ejecutando una versión anterior del servidor socket.io) ¿Significa esto que la versión del cliente y del servidor de socket.io siempre debe coincidir? ¿Está dicho en alguna parte?

Estoy usando 1.7.3 y el error sigue ahí. La degradación a 1.4.8 ayudó, pero la función emit parece funcionar de manera diferente. ¿Hay algún progreso para solucionar este problema en 1.7.3?

Acabo de encontrar algo similar a esto ... sin embargo, sin cadenas de consulta. Simplemente estoy llamando io([path]) w / path === "activities" .

Tengo una vista en mi aplicación que establece dos sockets con espacio de nombres, "/ visitas" y "/ actividades" ... el socket "/ visitas" se conecta muy bien. Veo el mensaje "Espacio de nombres no válido" cuando intento conectarme al espacio de nombres "/ actividades".

No estoy seguro de por qué está haciendo esto. Estoy siguiendo el mismo patrón para otra vista que usa "/ homes" y "/ visitas" y ambos sockets están bien establecidos en esa vista.

@RavenHursT, ¿ se ha creado correctamente el espacio activities nombres io.of('/activities'); )? ¿Podrías reproducir el problema con el violín aquí?

Sí ... mah bad ... Me había olvidado de agregar el espacio de nombres del lado del servidor y me olvidé de actualizar aquí. Favor de ignorar :-/

¿Fue útil esta página
0 / 5 - 0 calificaciones