Socket.io-client: Erro de sondagem XHR aparece quando o depurador está presente

Criado em 13 abr. 2017  ·  30Comentários  ·  Fonte: socketio/socket.io-client

Você quer:

  • [x] relatar um bug
  • [] solicitar um recurso

Comportamento atual

Estou tendo problemas ao tentar fazer uma conexão de soquete da web no react-native. Não tenho certeza se esta plataforma é compatível ou não, no entanto, esse erro pode ser reproduzido em um aplicativo node.js normal. Estranhamente, só tenho problemas quando o depurador integrado do react-native está desabilitado . Estou testando isso no IOS 10.2 com react-native v0.43.1 e socket.io-client v1.7.3 . Meu servidor está executando socket.io v1.7.2 hospedado na porta HTTP 1337.

Etapas para reproduzir (se o comportamento atual for um bug)

Assim que eu implementar socket.io-client no react-native e tentar uma conexão sem o depurador habilitado, ele deve reproduzir com dois erros com base nas opções. Se eu não especificar minha opção de transporte, o erro será XHR: POLLING ERROR . Se eu especificar 'websocket' em minha opção de transportes, o erro se tornará WEBSOCKET ERROR . Isso é tudo que eu recebo.

Comportamento esperado

Conexão regular de socket da web com meu servidor. Funciona com o depurador habilitado.

Configurar

  • SO: OSX El Capitan 10.11.6
  • navegador: acredito que o react-native usa o webkit, mas não tenho certeza.
  • versão socket.io: declarada acima

Outras informações (por exemplo, rastreamentos de pilha, problemas relacionados, sugestões de como corrigir)

O único outro problema que encontrei relacionado a este foi o # 1056 e estou surpreso com a estranha relação desses problemas. Tentei novamente o cenário em um aplicativo node.js normal e experimentei resultados semelhantes, no entanto, os erros foram mais detalhados conforme mostrado abaixo.

Sem uma opção de transporte especificada:

{ Error: xhr poll error
    at XHR.Transport.onError (/path/to/root/node_modules/engine.io-client/lib/transport.js:64:13)
    at Request.<anonymous> (/path/to/root/node_modules/engine.io-client/lib/transports/polling-xhr.js:129:10)
    at Request.Emitter.emit (/path/to/root/node_modules/component-emitter/index.js:133:20)
    at Request.onError (/path/to/root/node_modules/engine.io-client/lib/transports/polling-xhr.js:307:8)
    at Timeout._onTimeout (/path/to/root/node_modules/engine.io-client/lib/transports/polling-xhr.js:254:18)
    at ontimeout (timers.js:365:14)
    at tryOnTimeout (timers.js:237:5)
    at Timer.listOnTimeout (timers.js:207:5) type: 'TransportError', description: 503 }

Com transports: ['websocket'] :

{ Error: websocket error
    at WS.Transport.onError (/path/to/root/node_modules/engine.io-client/lib/transport.js:64:13)
    at WebSocket.ws.onerror (/path/to/root/node_modules/engine.io-client/lib/transports/websocket.js:149:10)
    at WebSocket.onError (/path/to/root/node_modules/ws/lib/WebSocket.js:452:14)
    at emitOne (events.js:96:13)
    at WebSocket.emit (events.js:189:7)
    at ClientRequest.onerror (/path/to/root/node_modules/ws/lib/WebSocket.js:711:10)
    at emitOne (events.js:96:13)
    at ClientRequest.emit (events.js:189:7)
    at TLSSocket.socketErrorListener (_http_client.js:358:9)
    at emitOne (events.js:96:13)
  type: 'TransportError',
  description: 
   { Error: socket hang up
       at TLSSocket.onHangUp (_tls_wrap.js:1117:19)
       at Object.onceWrapper (events.js:291:19)
       at emitNone (events.js:91:20)
       at TLSSocket.emit (events.js:186:7)
       at endReadableNT (_stream_readable.js:974:12)
       at _combinedTickCallback (internal/process/next_tick.js:74:11)
       at process._tickCallback (internal/process/next_tick.js:98:9)
     code: 'ECONNRESET',
     type: 'error',
     target: 
      WebSocket {
        domain: null,
        _events: [Object],
        _eventsCount: 4,
        _maxListeners: undefined,
        _socket: null,
        _ultron: null,
        _closeReceived: false,
        bytesReceived: 0,
        readyState: 0,
        supports: [Object],
        extensions: {},
        _binaryType: 'nodebuffer',
        _isServer: false,
        url: 'wss://SERVER_IP:1337/socket.io/?EIO=3&transport=websocket',
        protocolVersion: 13 } } }

Também tenha em mente que o cliente baseado em navegador de socket.io funciona perfeitamente conectando-se a este servidor web específico.

Eu tentei várias redes diferentes, ISP's e até VPNs. Eu estou sem noção neste ponto.

Comentários muito úteis

Resolvi meu problema há uma semana refatorando, mas não me lembro o que resolveu exatamente o problema. Desculpe por isso, tive uma semana ocupada e esse foi o commit inicial.

Você pode tentar definir opts.transports para apenas websocket no cliente:

io.connect(url, { transports: ['websocket'] }); // default is ['polling', 'websocket']

Eu tinha um soquete muito complicado e uma lógica de associação de ação antes de refatorar o código. Portanto, certifique-se de que sua lógica de soquete em seu código esteja funcionando e torne-o mais simples de depurar.

Todos 30 comentários

ATUALIZAÇÃO : Depois de finalmente testar um dos meus aplicativos no meu iPhone com socket.io-client, tive a sorte de não encontrar o erro de pesquisa XHR. Ainda estou, no entanto, tendo esse erro em um aplicativo de nó normal.

Atualmente, estou tendo o mesmo problema com meu aplicativo de nó também. Eu uso o servidor embutido de socket.io e parece funcionar bem no navegador, mas no app de nó socket.io-client gera o mesmo erro de enquete 503 xhr acima. Estou executando o servidor e o cliente na mesma máquina, mas a conexão ao loopback ou ao endereço de rede local do aplicativo cliente não está funcionando. Estou usando a versão 1.7.3 de socket.io e socket.io-client .

Também vejo este erro na versão 2.0.1 (cliente e servidor) ao executar a partir do nó.

Resolvi meu problema há uma semana refatorando, mas não me lembro o que resolveu exatamente o problema. Desculpe por isso, tive uma semana ocupada e esse foi o commit inicial.

Você pode tentar definir opts.transports para apenas websocket no cliente:

io.connect(url, { transports: ['websocket'] }); // default is ['polling', 'websocket']

Eu tinha um soquete muito complicado e uma lógica de associação de ação antes de refatorar o código. Portanto, certifique-se de que sua lógica de soquete em seu código esteja funcionando e torne-o mais simples de depurar.

Vou tentar o nosso transporte. Por enquanto, fiz o downgrade para 1.7.4 e tudo parece funcionar.

Sim, baixei a versão 2.0.1 para 1.7.4. Corrijo isso

Então, eu atualizei de volta para 2.0.1 e configurei meu cliente para usar apenas o transporte de websocket. (Quase) funciona:

io(`localhost:8080`, {
    transports: [ 'websocket' ],
    upgrade: false
});

Agora, meu único problema é que o transporte do websocket está quebrado para escopos de trabalho da web. Acho que identifiquei o problema e abri um problema correspondente em engine.io-client aqui https://github.com/socketio/engine.io-client/issues/569

Existe algum erro lançado? Você poderia executar com a depuração habilitada? ( DEBUG=engine* )

Em relação ao react-native, pode estar vinculado a https://github.com/socketio/socket.io-client/issues/1114.

@darrachequesne Então, acabei de reverter para os transportes padrão no meu componente cliente do lado do servidor. Meu erro aí ... O transporte de votação definitivamente está funcionando para mim. O problema que eu tive foi com meus certificados SSL autoassinados para dev local. Tive que adicionar rejectUnauthorized: process.env.NODE_ENV === 'production' à configuração de socket.io para fazê-lo funcionar. Caso contrário, eu estava recebendo 503 .

O problema do web worker é real. socketio / engine.io-client # 569

tente isso

require('socket.io-client')('http://localhost', {
  rejectUnauthorized:   false,
})

Obrigado vou tentar
----- A mensagem original -----
De: Zetsin [email protected]
Destinatário: "socketio / socket.io-client" [email protected]
Cc: Wangzhiqiang [email protected] , Comentário [email protected]
Assunto: Re: [socketio / socket.io-client] Erro de sondagem XHR aparece quando o depurador está presente (# 1097)
Data: 16:22, 20 de maio de 2017

tente isso
require ('socket.io-client') ('http: // localhost', {
rejeitarUnauthorized: false,
})

-
Você está recebendo isto porque comentou.
Responda a este e-mail diretamente, visualize-o no GitHub ou ignore a conversa.

Eu tenho o mesmo problema. Então eu mudo meu código de cliente para

require('socket.io-client')('wss://myserver:port/ws', { transports: ['websocket'], rejectUnauthorized: false });

Mas agora, obtenho uma resposta de erro 404. O log mostra que há um /socket.io/ adicional adicionado ao meu url de solicitação.

 { Error: unexpected server response (404)
       at ClientRequest._req.on (/Users/chris/Projects/nationsky/mgmt-server/backend/node_modules/ws/lib/WebSocket.js:650:26)
       at emitOne (events.js:115:13)
       at ClientRequest.emit (events.js:210:7)
       at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:564:21)
       at HTTPParser.parserOnHeadersComplete (_http_common.js:116:23)
       at TLSSocket.socketOnData (_http_client.js:453:20)
       at emitOne (events.js:115:13)
       at TLSSocket.emit (events.js:210:7)
       at addChunk (_stream_readable.js:252:12)
       at readableAddChunk (_stream_readable.js:239:11)
     type: 'error',
     target:
      WebSocket {
        domain: null,
        _events: [Object],
        _eventsCount: 4,
        _maxListeners: undefined,
        readyState: 0,
        bytesReceived: 0,
        extensions: {},
        protocol: '',
        _binaryType: 'arraybuffer',
        _finalize: [Function: bound finalize],
        _finalizeCalled: false,
        _closeMessage: null,
        _closeTimer: null,
        _closeCode: null,
        _receiver: null,
        _sender: null,
        _socket: null,
        _ultron: null,
        protocolVersion: 13,
        _isServer: false,
        url: 'wss://myserver:port/socket.io/?access_token=HnbtDUEWu1i1HVrAn-DO9YOL6GZxoittWAf8Sz_RR0s&EIO=3&transport=websocket',
        _req: [Object] } } }

Para mim, parece mesmo que o depurador não esteja presente

Oi! Tive o mesmo problema enquanto tentava me conectar de um aplicativo Node.js ao servidor. Aqui está meu código:

const socket = require('socket.io-client')('https://domain.com')

O log que consegui executando DEBUG=engine* npm run dev era parecido com este:

asciicast

engine.io-client:socket creating transport "polling" +2s
engine.io-client:polling polling +1ms
engine.io-client:polling-xhr xhr poll +0ms
engine.io-client:polling-xhr xhr open GET: https://domain.com/socket.io/?EIO=3&transport=polling&t=LzBM71r&b64=1 +0ms
engine.io-client:polling-xhr xhr data null +0ms
engine.io-client:socket setting transport polling +1ms
engine.io-client:socket socket error {"type":"TransportError","description":503} +7ms
engine.io-client:socket socket close with reason: "transport error" +0ms
engine.io-client:polling transport not open - deferring close +0ms

Quando tentei conectar de um navegador a https://domain.com/socket.io/socket.io.js funcionou e usando io('https://domain.com') também, então segui as instruções nos comentários e mudei meu código para:

const socket = require('socket.io-client')('https://domain.com', { rejectUnauthorized: false })

E funcionou, mas é estranho, tenho certificados válidos do Let's Encrypt ou é normal? de qualquer maneira .. eu adicionei a opção transports (dos comentários também) para evitar outras conexões além de websocket e no final o código era:

const socket = require('socket.io-client')('https://domain.com', {
  transports: ['websocket'],
  rejectUnauthorized: false
})

Obrigado @ibrahimduran e @SupremeTechnopriest : smile:

Minhas desculpas se escrevi como Tarzan: sweat_smile: estou trabalhando no meu inglês haha

Eu tive esse problema e passei 2 horas nisso, mas estou apenas especificando suas opções corretamente. Aqui está como você deve especificá-los:

   let socketClient = socketIOClient.connect(`http://localhost:3001`,{ // [1] Important as fuck 
      reconnectionDelay: 1000,
      reconnection:true,
      reconnectionAttempts: 10,
      transports: ['websocket'],
      agent: false, // [2] Please don't set this to true
      upgrade: false,
      rejectUnauthorized: false
   });

[1] Se você não especificar se deve usar http ou https, o padrão é https. Ou se você não especificar a porta logo após o url como "url. Com: porta ", o padrão é 80 ou 443, dependendo do protocolo. Eu vi algumas respostas de stackoverflow que têm a porta especificada como uma opção no objeto options. Verifiquei o código e não existe essa opção. Você precisa incluir a porta no url.

[2] Além disso, configurei o agente como verdadeiro e ele falhou ao estabelecer uma conexão ws e não houve erro, simplesmente expirou. Apenas não especifique o agente. O padrão é falso.

@ teja42 Tentei consertar esse problema por 2 dias. Achei que fosse um problema de agrupamento com o webpack, mas sua solução funcionou perfeitamente. Obrigado!

Oi !

Eu tive o mesmo problema e consertei o downgrade de 2.0.1 para 1.7.4 que

obrigado !

Olá, ainda tenho este problema ao tentar no Android 8.1 :(

Pseudo-código:
`` `
this.socket = io.connect ('https: // xxxxxxxxxxxxxx', {
caminho: '/ socketchannel',
reconnectionDelay: 1000,
reconexão: verdadeiro,
tentativas de reconexão: 10,
transportes: ['websocket'],
agente: falso,
atualização: falso,
rejeitarUnauthorized: falso
});

this.socket.on ('conectar', () => {
console.log ('soquete conectado!')
})
this.socket.on ('connect_error', (err) => {
console.log ('erro de soquete conectado ->' + err);
})

`` `
O aplicativo entra no evento 'connection_error' e registra "Erro: erro de websocket"

"reagir nativo": "0.57.4",
"socket.io-client": "1.7.4"

Alguma sugestão?

O aplicativo entra no evento 'connection_error' e registra "Erro: erro de websocket"

Enfrentando o mesmo problema

    "react-native": "https://github.com/expo/react-native/archive/sdk-32.0.0.tar.gz",
    "engine.io-client": "~3.3.2",
    "socket.io-client": "2.1.1",

Estou enfrentando o mesmo problema, alguma atualização sobre ele?

1 para isso

Tive esse problema devido a origins do servidor de soquete.
Então, agora, como adicionar origens?

Olá a todos. Portanto, estou usando o cluster PM2 para meu servidor Node Express e usando o adaptador Redis:

const redis = require('socket.io-redis') 
io.adapter(redis(config.redis))

Para clientes de navegador, isso parece bom, mas para socket.io-client eu recebo:

{ Error: xhr post error
    at XHR.Transport.onError (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transport.js:67:13)
    at Request.<anonymous> (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:111:10)
    at Request.Emitter.emit (/home/user/Desktop/nodeclienttest/node_modules/component-emitter/index.js:133:20)
    at Request.onError (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:311:8)
    at Timeout._onTimeout (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:258:18)
    at listOnTimeout (timers.js:327:15)
    at processTimers (timers.js:271:5) type: 'TransportError', description: 400 }
{ Error: xhr poll error
    at XHR.Transport.onError (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transport.js:67:13)
    at Request.<anonymous> (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:130:10)
    at Request.Emitter.emit (/home/user/Desktop/nodeclienttest/node_modules/component-emitter/index.js:133:20)
    at Request.onError (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:311:8)
    at Timeout._onTimeout (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:258:18)
    at listOnTimeout (timers.js:327:15)
    at processTimers (timers.js:271:5) type: 'TransportError', description: 400 }

Se eu alterar o código do cliente para usar o transporte de websocket, tudo funcionará bem.

var socket = require("socket.io-client")("http://localhost:8080", { transports: ['websocket'] });

O problema é que não quero exigir essa alteração de código em todos os códigos do cliente.

Minha recomendação é alterar o socket.io-client para tentar o transporte do websocket se o transporte de polling do xhr estiver falhando. O que você acha?

tentar a última versão do github, assim, resolveu meus problemas com o RN android:

npm i socketio/engine.io-client#3.3.2 -S

Felicidades

Sei que essa solução vai parecer um pouco estranha, mas cheguei aqui pesquisando esse erro no Google.

No meu caso, estava recebendo isso porque meu servidor não estava funcionando (pensei que estava). Espero que ajude mais alguém :)

tente isso

require('socket.io-client')('http://localhost', {
  rejectUnauthorized:   false,
})

Obrigado, eu estava tendo problemas para conectar ao meu servidor a partir de um aplicativo de nó e esta solução funcionou bem para mim.

tente isso

require('socket.io-client')('http://localhost', {
  rejectUnauthorized:   false,
})

Obrigado, eu estava tendo problemas para conectar ao meu servidor a partir de um aplicativo de nó e esta solução funcionou bem para mim.
Olá, gostaria de saber qual versão do socket.io e socket.io-client você está usando

tente isso

require('socket.io-client')('http://localhost', {
  rejectUnauthorized:   false,
})

Obrigado, eu estava tendo problemas para conectar ao meu servidor a partir de um aplicativo de nó e esta solução funcionou bem para mim.
Olá, gostaria de saber qual versão do socket.io e socket.io-client você está usando

Estou usando socket.io e socket.io-client na versão 2.3.0.

Olá, ainda tenho este problema ao tentar no Android 8.1 :(

Pseudo-código:

this.socket = io.connect('https://xxxxxxxxxxxxxx', { 
     path: '/socketchannel', 
     reconnectionDelay: 1000,
     reconnection:true,
     reconnectionAttempts: 10,
     transports: ['websocket'],
     agent: false, 
     upgrade: false,
     rejectUnauthorized: false
   });

this.socket.on('connect', () => {
     console.log('socket connected!')
   })
this.socket.on('connect_error', (err) => {
     console.log('socket connected error --> ' + err);
   })

O aplicativo entra no evento 'connection_error' e registra "Erro: erro de websocket"

"reagir nativo": "0.57.4",
"socket.io-client": "1.7.4"

Alguma sugestão?

Mesmo problema. Você resolve?

Eu resolvo meu problema usando o nome de domínio.

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