Socket.io-client: Erro de namespace inválido (apenas no Linux Ubuntu)

Criado em 13 out. 2016  ·  16Comentários  ·  Fonte: socketio/socket.io-client

Eu tenho um script NodeJS destinado a ser executado em um dispositivo e um aplicativo em um servidor. Quero conectar o dispositivo ao namespace /device no servidor. Isso funciona perfeitamente no Windows. No Ubuntu, entretanto, o dispositivo simplesmente nunca se conecta. Passar uma variável DEBUG env dá esta saída:

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

Ou seja, o namespace parece ser inválido. Não tenho ideia do porquê, já que esse código funciona perfeitamente no Windows.
Código do meu 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');
})

Código do meu servidor:

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

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

Qualquer ideia seria útil.

Unable to reproduce

Comentários muito úteis

Estou usando o 1.7.3 e o erro ainda está lá. O downgrade para 1.4.8 ajudou, mas a função emit parece funcionar de maneira diferente. Há algum progresso na correção disso no 1.7.3?

Todos 16 comentários

Também notei isso na socket.io-client versão 1.5.0. Parece que por algum motivo o valor de opts.query é anexado ao nome dos namespaces, o que causa o erro "namespace inválido".

exemplo:

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

Ele deve se conectar ao namespace /hello mas ao invés disso, ele tenta se conectar ao namespace /hello?foo=bar .

Eu testei no 1.4.8 e não há erro, então esse bug foi introduzido em algum lugar depois disso. (Além disso, não acho que esse bug esteja relacionado ao Ubuntu especificamente porque posso reproduzi-lo no Win7 e Mint Rosa.)

Ah ok, isso faz sentido. Hm. Você tem alguma ideia para um remédio ou onde devo procurar no repositório se quiser consertar isso?

Não tenho ideia de como consertar isso, mas você pode fazer o downgrade para [email protected] onde esse bug não existe, foi o que fiz de qualquer maneira.

Isso pode estar vinculado a https://github.com/socketio/socket.io-client/pull/943 (e https://github.com/socketio/socket.io/pull/2422)

Eu testei na v1.4.8 e funcionou conforme o esperado. Então testei com a v1.5 apenas no cliente e parou de funcionar. No entanto, a instalação da v1.5 no cliente _and_ do servidor corrigiu o problema.

Portanto, parece que o bug só acontece quando há uma incompatibilidade de versão entre cliente e servidor, mas não quando ambos têm a mesma versão, seja acima ou abaixo de v1.5.

@ Arrow7000 você poderia verificar se 1.6.0 corrigiu seu problema?

Ainda estou tendo esse problema com a v1.7.2

@stgogm você está usando 1.7.2 no cliente e no servidor? É exatamente o mesmo problema?

@darrachequesne Sim, estou. E o erro é o mesmo: ele tenta se conectar a /namespace?q=value , por exemplo, ao invés de se conectar a /namespace e passar q como um parâmetro de consulta.

@stgogm, você pode fornecer um caso de teste com falha? Não consigo reproduzir: https://github.com/darrachequesne/socket.io-fiddle/tree/issue/invalid-namespace

@darrachequesne Efetivamente, o erro foi embora. Talvez o back-end não tenha sido atualizado naquele momento. Desculpe pelo relatório errado e obrigado pelo seu tempo!

Estou tendo o mesmo problema, em que funciona na versão do cliente 1.4.8, mas falha na 1.5.1. (Estou executando uma versão mais antiga do servidor socket.io) Isso significa que a versão do cliente e do servidor do socket.io devem sempre coincidir? Isso está declarado em algum lugar?

Estou usando o 1.7.3 e o erro ainda está lá. O downgrade para 1.4.8 ajudou, mas a função emit parece funcionar de maneira diferente. Há algum progresso na correção disso no 1.7.3?

Acabei de encontrar algo semelhante a isso .. porém sem strings de consulta. Estou simplesmente chamando io([path]) w / path === "activities" .

Eu tenho um modo de exibição em meu aplicativo que estabelece dois sockets com espaço de nomes, "/ visitas" e "/ atividades" ... o soquete "/ visitas" se conecta perfeitamente. Vejo a mensagem "Namespace inválido" ao tentar me conectar ao namespace "/ Activities".

Não sei por que está fazendo isso. Estou seguindo o mesmo padrão para outra visão que usa "/ homes" e "/ visitas" e ambos os soquetes estão estabelecidos perfeitamente nessa visão.

@RavenHursT o activities foi criado corretamente? (com io.of('/activities'); )? Você poderia reproduzir o problema com o violino aqui?

Sim ... mah ruim .. Eu tinha esquecido de adicionar o namespace do lado do servidor e esqueci de atualizar aqui. Por favor, desconsidere: - /

Esta página foi útil?
0 / 5 - 0 avaliações