Socket.io-client: XHR Polling Error erscheint, wenn Debugger vorhanden ist

Erstellt am 13. Apr. 2017  ·  30Kommentare  ·  Quelle: socketio/socket.io-client

Sie wollen:

  • [x] einen Fehler melden
  • [ ] Feature anfordern

Aktuelles Verhalten

Ich habe Probleme beim Versuch, eine Web-Socket-Verbindung auf React-Native herzustellen. Ich bin mir nicht sicher, ob diese Plattform unterstützt wird oder nicht, dieser Fehler ist jedoch in einer regulären node.js-App reproduzierbar. Seltsamerweise habe ich nur Probleme, wenn der eingebaute Debugger von Reactive-Native deaktiviert ist . Ich teste dies auf IOS 10.2 mit react-native v0.43.1 und socket.io-client v1.7.3 . Auf meinem Server läuft socket.io v1.7.2 gehostet auf HTTP-Port 1337.

Schritte zum Reproduzieren (wenn das aktuelle Verhalten ein Fehler ist)

Sobald ich socket.io-client in Reactive-native implementiere und eine Verbindung ohne aktivierten Debugger versuche, sollte es sich anhand der Optionen mit zwei Fehlern reproduzieren. Wenn ich meine Transportoption nicht angebe, wäre der Fehler XHR: POLLING ERROR . Wenn ich 'websocket' in meiner Transportoption angebe, würde der Fehler WEBSOCKET ERROR . Das ist alles was ich bekomme.

Erwartetes Verhalten

Regelmäßige Web-Socket-Verbindung zu meinem Server. Es funktioniert mit aktiviertem Debugger.

Konfiguration

  • Betriebssystem: OSX El Capitan 10.11.6
  • browser: Ich glaube, React-Native verwendet Webkit, bin mir aber nicht sicher.
  • socket.io-Version: oben angegeben

Sonstige Informationen (z. B. Stacktraces, verwandte Probleme, Vorschläge zur Behebung)

Das einzige andere Problem, das ich im Zusammenhang mit diesem gefunden habe, war Nr. 1056 und ich bin überrascht, wie seltsam diese Probleme zusammenhängen. Ich habe das Szenario mit einer regulären node.js-App erneut versucht und ähnliche Ergebnisse erlebt, jedoch waren die Fehler detaillierter, wie unten gezeigt.

Ohne eine angegebene Transportoption:

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

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

Denken Sie auch daran, dass der browserbasierte Client von socket.io einwandfrei funktioniert, wenn er sich mit diesem speziellen Webserver verbindet.

Ich habe verschiedene verschiedene Netzwerke, ISPs und sogar VPNs ausprobiert. Ich bin an dieser Stelle ahnungslos.

Hilfreichster Kommentar

Ich habe mein Problem vor einer Woche durch Refactoring gelöst, aber ich weiß nicht mehr, was das Problem genau gelöst hat. Tut mir leid, ich hatte eine arbeitsreiche Woche und das war die erste Verpflichtung.

Sie können versuchen, opts.transports websocket im Client auf nur

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

Ich hatte eine zu komplizierte Socket- und Aktionsbindungslogik, bevor ich den Code umgestaltete. Stellen Sie also sicher, dass Ihre Socket-Logik in Ihrem Code funktioniert, und vereinfachen Sie das Debuggen.

Alle 30 Kommentare

UPDATE : Nachdem ich endlich eine meiner Anwendungen auf meinem iPhone mit socket.io-client getestet habe, hatte ich das Glück, nicht auf den XHR Polling-Fehler zu stoßen. Bei einer regulären Knoten-App tritt dieser Fehler jedoch immer noch auf.

Ich habe derzeit auch das gleiche Problem mit meiner Knotenanwendung. Ich verwende den integrierten Server von socket.io und es scheint im Browser gut zu funktionieren, aber in der Node-App gibt socket.io-client den gleichen 503 xhr-Abfragefehler wie oben aus. Ich betreibe Server und Client auf demselben Computer, aber die Verbindung zum Loopback oder zur lokalen Netzwerkadresse von der Clientanwendung funktioniert nicht. Ich verwende Version 1.7.3 von socket.io und socket.io-client .

Ich sehe diesen Fehler auch in Version 2.0.1 (Client und Server), wenn ich vom Knoten aus ausgeführt werde.

Ich habe mein Problem vor einer Woche durch Refactoring gelöst, aber ich weiß nicht mehr, was das Problem genau gelöst hat. Tut mir leid, ich hatte eine arbeitsreiche Woche und das war die erste Verpflichtung.

Sie können versuchen, opts.transports websocket im Client auf nur

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

Ich hatte eine zu komplizierte Socket- und Aktionsbindungslogik, bevor ich den Code umgestaltete. Stellen Sie also sicher, dass Ihre Socket-Logik in Ihrem Code funktioniert, und vereinfachen Sie das Debuggen.

Ich werde es mit dem Transport versuchen. Im Moment habe ich ein Downgrade auf 1.7.4 durchgeführt und alles scheint zu funktionieren.

Ja, ich habe die Version von 2.0.1 auf 1.7.4 heruntergefahren, um dies zu beheben

Also habe ich wieder auf 2.0.1 aktualisiert und meinen Client so eingerichtet, dass er nur den Websocket-Transport verwendet. Es funktioniert (fast) :

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

Jetzt ist mein einziges Problem, dass der Websocket-Transport für Webworker-Bereiche unterbrochen ist. Ich glaube, ich habe das Problem identifiziert und ein entsprechendes Problem auf engine.io-client hier geöffnet https://github.com/socketio/engine.io-client/issues/569

Wird ein Fehler ausgegeben? Könnten Sie mit aktiviertem Debug laufen? ( DEBUG=engine* )

In Bezug auf Reactive-Native kann dies mit https://github.com/socketio/socket.io-client/issues/1114 verlinkt werden

@darrachequesne Also habe ich gerade auf meiner serverseitigen rejectUnauthorized: process.env.NODE_ENV === 'production' zur socket.io-Konfiguration hinzufügen, damit es funktioniert. Ich habe sonst 503 .

Das Problem mit dem Webworker ist jedoch real. socketio/engine.io-client#569

Versuche dies

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

Danke ich werde es versuchen
----- Die ursprüngliche Nachricht-----
Von: Zetsin [email protected]
Empfänger: "socketio/socket.io-client" [email protected]
Cc: Wangzhiqiang [email protected] , Kommentar [email protected]
Betreff: Re: [socketio/socket.io-client] XHR Polling Error erscheint, wenn Debugger vorhanden ist (#1097)
Datum: 16:22, 20. Mai 2017

Versuche dies
require('socket.io-client')('http://localhost', {
ablehnenUnberechtigt: falsch,-
})


Sie erhalten dies, weil Sie einen Kommentar abgegeben haben.
Antworten Sie direkt auf diese E-Mail, zeigen Sie sie auf GitHub an oder schalten Sie den Thread stumm.

Ich habe das gleiche Problem. Dann ändere ich meinen Kundencode in

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

Aber jetzt bekomme ich eine 404-Fehlerantwort. Das Protokoll zeigt, dass meiner Anfrage-URL ein zusätzliches /socket.io/ hinzugefügt wurde.

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

Bei mir erscheint es auch wenn der Debugger nicht vorhanden ist

Hallo! Ich hatte das gleiche Problem, als ich versuchte, eine Verbindung von einer Node.js-App zum Server herzustellen. Hier ist mein Code:

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

Das Protokoll, das ich DEBUG=engine* npm run dev laufen ließ, war etwa so:

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

Als ich versuchte, eine Verbindung von einem Browser zu https://domain.com/socket.io/socket.io.js herzustellen, funktionierte es auch mit io('https://domain.com') , also folgte ich den Anweisungen in den Kommentaren und änderte meinen Code in:

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

Und es hat funktioniert, aber es ist seltsam, ich habe gültige Zertifikate von Let's Encrypt , oder ist es normal? wie auch immer.. ich habe die Option transports hinzugefügt (auch aus den Kommentaren), um andere Verbindungen als websocket zu vermeiden und am Ende war der Code:

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

Danke @ibrahimduran und @SupremeTechnoprest :lächeln:

Ich entschuldige mich, wenn ich wie Tarzan geschrieben habe :sweat_smile: Ich arbeite an meinem Englisch haha

Ich hatte dieses Problem und habe 2 Stunden damit verbracht. Es stellte sich heraus, dass es nur Ihre Optionen richtig angibt. So sollten Sie sie angeben:

   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] Wenn Sie nicht angeben, ob http oder https verwendet werden soll, wird standardmäßig https verwendet. Oder wenn Sie die Port direkt nach der URL als angeben dont „url. Com: port “ wird standardmäßig auf 80 oder 443 auf dem Protokoll abhängig. Ich habe einige Stackoverflow-Antworten gesehen, bei denen der Port als Option im Optionsobjekt angegeben ist. Ich habe mir den Code angesehen und es gibt keine solche Option. Sie müssen den Port in die URL einschließen.

[2] Außerdem habe ich den Agenten auf "true" gesetzt und es konnte keine ws-Verbindung hergestellt werden, und es trat kein Fehler auf, es ist einfach eine Zeitüberschreitung aufgetreten. Geben Sie den Agenten einfach nicht an. Der Standardwert ist false.

@teja42 Ich habe 2 Tage

Hallo !

Ich hatte das gleiche Problem und habe das Downgrade von 2.0.1 auf 1.7.4 behoben, wie @SupremeTechnopriest sagte und alles funktioniert gut!

Danke !

Hallo, ich habe immer noch dieses Problem beim Versuch mit Android 8.1 :(

Pseudocode:
```
this.socket = io.connect('https://xxxxxxxxxxxxxx', {
Pfad: '/socketchannel',
Wiederverbindungsverzögerung: 1000,
Wiederverbindung: wahr,
Wiederverbindungsversuche: 10,
Transporte: ['websocket'],
Agent: falsch,-
Upgrade: falsch,-
ablehnenUnberechtigt: falsch
});

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

```
Die Anwendung geht in das Ereignis 'connection_error' und protokolliert "Fehler: Websocket-Fehler"

"reaktiv-nativ": "0.57.4",
"socket.io-client": "1.7.4"

Irgendwelche Vorschläge?

Die Anwendung geht in das Ereignis 'connection_error' und protokolliert "Fehler: Websocket-Fehler"

Stehe vor dem gleichen Problem

    "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",

Ich stehe vor dem gleichen Problem, gibt es ein Update dazu?

+1 dafür

Ich hatte dieses Problem aufgrund von origins des Socket-Servers.
Wie also nun Ursprünge hinzufügen?

Hallo zusammen. Also verwende ich den PM2-Cluster für meinen Node-Express-Server und den Redis-Adapter:

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

Für Browser-Clients scheint dies in Ordnung zu sein, aber für socket.io-client erhalte ich:

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

Wenn ich den Clientcode ändere, um den Websocket-Transport zu verwenden, funktioniert alles einwandfrei.

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

Das Problem ist, dass ich diese Codeänderung nicht für den gesamten Clientcode fordern möchte.

Meine Empfehlung ist, socket.io-client so zu ändern, dass der Websocket-Transport versucht wird, wenn der xhr-Abruftransport fehlschlägt. Was denkst du?

Versuchen Sie die letzte Version von github, wie folgt, meine Probleme mit RN Android gelöst:

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

Beifall

Ich weiß, dass diese Lösung etwas seltsam klingen wird, aber ich bin hierher gekommen, indem ich diesen Fehler gegoogelt habe.

In meinem Fall bekam ich dies, weil mein Server nicht lief (ich dachte, es wäre so). Hoffe das hilft jemand anderem :)

Versuche dies

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

Danke, ich hatte Probleme, eine Verbindung zu meinem Server von einer Knotenanwendung aus herzustellen, und diese Lösung hat für mich gut funktioniert.

Versuche dies

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

Danke, ich hatte Probleme, eine Verbindung zu meinem Server von einer Knotenanwendung aus herzustellen, und diese Lösung hat für mich gut funktioniert.
Hallo, ich habe mich gerade gefragt, welche Version von socket.io und socket.io-client Sie verwenden

Versuche dies

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

Danke, ich hatte Probleme, eine Verbindung zu meinem Server von einer Knotenanwendung aus herzustellen, und diese Lösung hat für mich gut funktioniert.
Hallo, ich habe mich gerade gefragt, welche Version von socket.io und socket.io-client Sie verwenden

Ich verwende sowohl socket.io als auch socket.io-client in der Version 2.3.0.

Hallo, ich habe immer noch dieses Problem beim Versuch mit Android 8.1 :(

Pseudocode:

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

Die Anwendung geht in das Ereignis 'connection_error' und protokolliert "Fehler: Websocket-Fehler"

"reaktiv-nativ": "0.57.4",
"socket.io-client": "1.7.4"

Irgendwelche Vorschläge?

Das gleiche Problem. Haben Sie es gelöst?

Ich löse mein Problem, indem ich den Domainnamen verwende.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen