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