Socket.io-client: Aparece un error de sondeo XHR cuando el depurador está presente

Creado en 13 abr. 2017  ·  30Comentarios  ·  Fuente: socketio/socket.io-client

Tú quieres:

  • [x] informar un error
  • [] solicitar una función

Comportamiento actual

Tengo problemas al intentar establecer una conexión de socket web en react-native. No estoy seguro de si esta plataforma es compatible o no, sin embargo, este error se puede reproducir en una aplicación de node.js normal. Curiosamente, solo tengo problemas cuando el depurador integrado de react-native está desactivado . Estoy probando esto en IOS 10.2 con react-native v0.43.1 y socket.io-client v1.7.3 . Mi servidor está ejecutando socket.io v1.7.2 alojado en el puerto HTTP 1337.

Pasos para reproducir (si el comportamiento actual es un error)

Tan pronto como implemente socket.io-client en react-native e intente una conexión sin el depurador habilitado, debería reproducirse con dos errores basados ​​en las opciones. Si no especifico mi opción de transporte, el error sería XHR: POLLING ERROR . Si especifico 'websocket' en mi opción de transporte, el error se convertiría en WEBSOCKET ERROR . Eso es todo lo que consigo.

Comportamiento esperado

Conexión de socket web regular a mi servidor. Funciona con el depurador habilitado.

Configuración

  • SO: OSX El Capitan 10.11.6
  • navegador: creo que react-native usa webkit, sin embargo, no estoy seguro.
  • versión socket.io: indicado arriba

Otra información (por ejemplo, seguimiento de pila, problemas relacionados, sugerencias de cómo solucionarlo)

El único otro problema que encontré relacionado con este fue el # 1056 y me sorprende lo extrañamente relacionados que están estos problemas. Intenté el escenario en una aplicación normal de node.js y experimenté resultados similares, sin embargo, los errores fueron más detallados como se muestra a continuación.

Sin una opción 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 }

Con 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 } } }

También tenga en cuenta que el cliente basado en navegador de socket.io funciona perfectamente al conectarse a este servidor web específico.

He probado varias redes diferentes, ISP e incluso VPN. No tengo ni idea en este momento.

Comentario más útil

Resolví mi problema hace una semana refactorizando, pero no recuerdo qué resolvió exactamente el problema. Perdón por eso, tuve una semana ocupada y ese fue el compromiso inicial.

Puede intentar configurar opts.transports a solo websocket en el cliente:

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

Tenía una lógica de enlace de acción y socket demasiado complicada antes de refactorizar el código. Así que asegúrese de que su lógica de socket en su código esté funcionando y simplifique la depuración.

Todos 30 comentarios

ACTUALIZACIÓN : Después de probar finalmente una de mis aplicaciones en mi iPhone con socket.io-client, tuve la suerte de no encontrarme con el error XHR Polling. Sin embargo, sigo experimentando este error en una aplicación de nodo normal.

Actualmente también tengo el mismo problema con mi aplicación de nodo. Utilizo el servidor integrado de socket.io y parece funcionar bien en el navegador, pero en la aplicación de nodo socket.io-client arroja el mismo error de encuesta 503 xhr anterior. Estoy ejecutando el servidor y el cliente en la misma máquina, pero la conexión al bucle invertido o la dirección de red local desde la aplicación cliente no funciona. Estoy usando la versión 1.7.3 de socket.io y socket.io-client .

También veo este error en la versión 2.0.1 (cliente y servidor) cuando se ejecuta desde el nodo.

Resolví mi problema hace una semana refactorizando, pero no recuerdo qué resolvió exactamente el problema. Perdón por eso, tuve una semana ocupada y ese fue el compromiso inicial.

Puede intentar configurar opts.transports a solo websocket en el cliente:

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

Tenía una lógica de enlace de acción y socket demasiado complicada antes de refactorizar el código. Así que asegúrese de que su lógica de socket en su código esté funcionando y simplifique la depuración.

Probaré el transporte de nosotros. Por ahora he rebajado a 1.7.4 y todo parece funcionar.

Sí, bajé la versión de 2.0.1 a 1.7.4, soluciono esto

Así que actualicé de nuevo a 2.0.1 y configuré mi cliente para usar solo el transporte websocket. Funciona (casi):

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

Ahora mi único problema es que el transporte websocket está roto para los ámbitos de los trabajadores web. Creo que identifiqué el problema y abrí un problema correspondiente en engine.io-client aquí https://github.com/socketio/engine.io-client/issues/569

¿Se ha producido algún error? ¿Podrías ejecutar con la depuración habilitada? ( DEBUG=engine* )

En cuanto a react-native, puede estar vinculado a https://github.com/socketio/socket.io-client/issues/1114.

@darrachequesne Así que volví a los transportes predeterminados en mi componente de cliente del lado del servidor. Mi error allí ... El transporte electoral definitivamente está funcionando para mí. El problema que tuve fue con mis certificados ssl autofirmados para desarrolladores locales. Tuve que agregar rejectUnauthorized: process.env.NODE_ENV === 'production' a la configuración de socket.io para que funcione. De lo contrario, estaba obteniendo un 503 .

Sin embargo, el problema del trabajador web es real. socketio / engine.io-client # 569

prueba esto

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

Gracias lo intentaré
----- El mensaje original -----
De: Zetsin [email protected]
Destinatario: "socketio / socket.io-client" [email protected]
Cc: Wangzhiqiang [email protected] , comentario [email protected]
Asunto: Re: [socketio / socket.io-client] Aparece un error de sondeo XHR cuando el depurador está presente (# 1097)
Fecha: 16:22, 20 de mayo de 2017

prueba esto
require ('socket.io-client') ('http: // localhost', {
rechazar Sin autorización: falso,
})

-
Estás recibiendo esto porque comentaste.
Responda a este correo electrónico directamente, véalo en GitHub o silencia el hilo.

Tengo el mismo problema. Luego cambio mi código de cliente a

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

Pero ahora, obtengo una respuesta de error 404. El registro muestra que hay un /socket.io/ adicional agregado a mi URL de solicitud.

 { 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 mí, parece incluso si el depurador no está presente

¡Hola! Tuve el mismo problema mientras intentaba conectarme desde una aplicación Node.js al servidor, aquí está mi código:

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

El registro que obtuve ejecutando DEBUG=engine* npm run dev era algo así:

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

Cuando intenté conectarme desde un navegador a https://domain.com/socket.io/socket.io.js funcionó y usé io('https://domain.com') también, así que seguí las instrucciones en los comentarios y cambié mi código a:

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

Y funcionó, pero es extraño, tengo certificados válidos de Let's Encrypt , ¿o es normal? de todos modos ... agregué la opción transports (de los comentarios también) para evitar otras conexiones además de websocket y al final el código era:

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

Gracias @ibrahimduran y @SupremeTechnopriest : sonríe:

Mis disculpas si escribí como Tarzán: sweat_smile: estoy trabajando en mi inglés jaja

Tuve este problema y pasé 2 horas en esto, resulta que solo especifica tus opciones correctamente. Así es como debe especificarlos:

   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] Si no especifica si usar http o https, el valor predeterminado es https. O si no especifica el puerto justo después de la URL como "url. Com: puerto ", el valor predeterminado es 80 o 443, según el protocolo. He visto algunas respuestas de stackoverflow que tienen el puerto especificado como una opción en el objeto de opciones. Revisé el código y no existe esa opción. Debe incluir el puerto en la URL.

[2] Y también, configuré el agente en verdadero y no pudo establecer una conexión ws y no hubo ningún error, simplemente se agotó el tiempo de espera. Simplemente no especifique el agente en absoluto. Su valor predeterminado es falso.

@ teja42 Intenté solucionar este problema durante 2 días. Pensé que era un problema de empaquetado con el paquete web, pero su solución funcionó de maravilla. ¡Gracias!

Hola !

Tuve el mismo problema y arreglé la degradación de 2.0.1 a 1.7.4 como dijo @SupremeTechnopriest y ¡todo funciona bien!

Gracias !

Hola, todavía tengo este problema al intentar con Android 8.1 :(

Pseudocódigo:
''
this.socket = io.connect ('https: // xxxxxxxxxxxxxx', {
ruta: '/ socketchannel',
retardo de reconexión: 1000,
reconexión: cierto,
Intentos de reconexión: 10,
transportes: ['websocket'],
agente: falso,
actualización: falso,
rechazar Sin autorización: falso
});

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

''
La aplicación entra en el evento 'connection_error' y registra "Error: error websocket"

"react-native": "0.57.4",
"socket.io-client": "1.7.4"

¿Alguna sugerencia?

La aplicación entra en el evento 'connection_error' y registra "Error: error websocket"

Enfrentando el mismo 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",

Estoy enfrentando el mismo problema, ¿alguna actualización al respecto?

+1 por eso

Tuve este problema debido a origins del servidor de socket.
Entonces, ¿cómo agregar orígenes?

Hola a todos. Entonces estoy usando el clúster PM2 para mi servidor node express y usando el adaptador redis:

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

Para los clientes del navegador, esto parece estar bien, pero para socket.io-client obtengo:

{ 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 }

Si cambio el código del cliente para usar el transporte websocket, todo funciona bien.

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

El problema es que no quiero requerir este cambio de código en todo el código del cliente.

Mi recomendación es cambiar socket.io-client para intentar el transporte websocket si el transporte de sondeo xhr falla. ¿Qué piensas?

probar la última versión de github, así, resolvió mis problemas con RN android:

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

Salud

Sé que esta solución va a sonar un poco extraña, pero llegué aquí buscando en Google este error.

En mi caso, recibí esto porque mi servidor no se estaba ejecutando (pensé que sí). Espero que ayude a alguien más :)

prueba esto

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

Gracias, estaba teniendo problemas para conectarme a mi servidor desde una aplicación de nodo y esta solución funcionó bien para mí.

prueba esto

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

Gracias, estaba teniendo problemas para conectarme a mi servidor desde una aplicación de nodo y esta solución funcionó bien para mí.
Hola, me preguntaba qué versión de socket.io y socket.io-client estás usando

prueba esto

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

Gracias, estaba teniendo problemas para conectarme a mi servidor desde una aplicación de nodo y esta solución funcionó bien para mí.
Hola, me preguntaba qué versión de socket.io y socket.io-client estás usando

Estoy usando socket.io y socket.io-client en la versión 2.3.0.

Hola, todavía tengo este problema al intentar con Android 8.1 :(

Pseudocó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);
   })

La aplicación entra en el evento 'connection_error' y registra "Error: error websocket"

"react-native": "0.57.4",
"socket.io-client": "1.7.4"

¿Alguna sugerencia?

Mismo problema ¿Lo resuelves?

Resuelvo mi problema usando el nombre de dominio.

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