Socket.io-client: Kesalahan Polling XHR muncul saat debugger hadir

Dibuat pada 13 Apr 2017  ·  30Komentar  ·  Sumber: socketio/socket.io-client

Yang kamu ingin:

  • [x] laporkan bug
  • [ ] meminta fitur

Perilaku saat ini

Saya mengalami masalah saat mencoba membuat koneksi soket web di react-native. Saya tidak yakin apakah platform ini didukung atau tidak, namun, kesalahan ini dapat direproduksi pada aplikasi node.js biasa. Anehnya saya hanya mengalami masalah ketika react-native built in debugger dinonaktifkan . Saya menguji ini di IOS 10.2 dengan react-native v0.43.1 dan socket.io-client v1.7.3 . Server saya menjalankan socket.io v1.7.2 dihosting di port HTTP 1337.

Langkah-langkah untuk mereproduksi (jika perilaku saat ini adalah bug)

Segera setelah saya mengimplementasikan socket.io-client di react-native dan mencoba koneksi tanpa debugger diaktifkan, itu harus mereproduksi dengan dua kesalahan berdasarkan opsi. Jika saya tidak menentukan opsi transports saya, maka kesalahannya adalah XHR: POLLING ERROR . Jika saya menentukan 'websocket' dalam opsi transports saya, maka kesalahannya akan menjadi WEBSOCKET ERROR . Itu saja yang saya dapatkan.

Perilaku yang diharapkan

Koneksi soket web biasa ke server saya. Ini bekerja dengan debugger diaktifkan.

Mempersiapkan

  • OS: OSX El Capitan 10.11.6
  • browser: Saya percaya reaksi-asli menggunakan webkit, namun saya tidak yakin.
  • versi socket.io: disebutkan di atas

Informasi lain (mis. stacktrace, masalah terkait, saran cara memperbaikinya)

Satu-satunya masalah lain yang saya temukan terkait dengan yang satu ini adalah #1056 dan saya terkejut tentang betapa anehnya terkait masalah ini. Saya telah mencoba kembali skenario pada aplikasi node.js biasa dan saya mengalami hasil yang serupa, namun kesalahannya lebih detail seperti yang ditunjukkan di bawah ini.

Tanpa opsi transportasi yang ditentukan:

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

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

Juga perlu diingat, klien berbasis browser socket.io bekerja dengan sempurna menghubungkan ke server web khusus ini.

Saya telah mencoba berbagai jaringan, ISP, dan bahkan VPN yang berbeda. Saya tidak tahu apa-apa pada saat ini.

Komentar yang paling membantu

Saya telah memecahkan masalah saya seminggu yang lalu dengan refactoring tetapi saya tidak ingat apa yang sebenarnya memecahkan masalah. Maaf untuk itu, saya memiliki minggu yang sibuk dan itu adalah komitmen awal.

Anda dapat mencoba mengatur opts.transports menjadi hanya websocket di klien:

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

Saya memiliki logika pengikatan soket dan tindakan yang terlalu rumit sebelum saya memfaktorkan ulang kode. Jadi, pastikan logika soket Anda dalam kode Anda berfungsi dan membuatnya lebih mudah untuk di-debug.

Semua 30 komentar

PEMBARUAN : Setelah akhirnya menguji salah satu aplikasi saya di iPhone saya dengan socket.io-client, saya beruntung tidak menemukan kesalahan Polling XHR. Namun, saya masih mengalami kesalahan ini pada aplikasi simpul biasa.

Saat ini saya juga mengalami masalah yang sama dengan aplikasi simpul saya. Saya menggunakan server built-in socket.io dan tampaknya berfungsi dengan baik di browser tetapi di aplikasi node socket.io-client melempar kesalahan polling 503 xhr yang sama di atas. Saya menjalankan server dan klien pada mesin yang sama tetapi menghubungkan ke loopback atau alamat jaringan lokal dari aplikasi klien tidak berfungsi. Saya menggunakan versi 1.7.3 dari keduanya socket.io dan socket.io-client .

Saya juga melihat kesalahan ini di versi 2.0.1 (klien dan server) saat dijalankan dari node.js.

Saya telah memecahkan masalah saya seminggu yang lalu dengan refactoring tetapi saya tidak ingat apa yang sebenarnya memecahkan masalah. Maaf untuk itu, saya memiliki minggu yang sibuk dan itu adalah komitmen awal.

Anda dapat mencoba mengatur opts.transports menjadi hanya websocket di klien:

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

Saya memiliki logika pengikatan soket dan tindakan yang terlalu rumit sebelum saya memfaktorkan ulang kode. Jadi, pastikan logika soket Anda dalam kode Anda berfungsi dan membuatnya lebih mudah untuk di-debug.

Saya akan mencoba transportasi kami. Untuk saat ini saya telah menurunkan versi ke 1.7.4 dan sepertinya semuanya berfungsi.

Ya, saya menurunkan versi dari 2.0.1 ke 1.7.4 memperbaiki ini

Jadi saya telah meningkatkan kembali ke 2.0.1 dan saya mengatur klien saya untuk menggunakan transportasi websocket saja. Ini (hampir) berfungsi:

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

Sekarang satu-satunya masalah saya adalah bahwa transportasi websocket rusak untuk lingkup pekerja web. Saya pikir saya telah mengidentifikasi masalah dan membuka masalah yang sesuai pada engine.io-client sini https://github.com/socketio/engine.io-client/issues/569

Apakah ada kesalahan yang dilemparkan? Bisakah Anda menjalankan dengan debug diaktifkan? ( DEBUG=engine* )

Mengenai reaksi asli, itu mungkin ditautkan ke https://github.com/socketio/socket.io-client/issues/1114.

@darrachequesne Jadi saya baru saja kembali ke transport default pada komponen klien sisi server saya. Kesalahan saya di sana ... Transportasi pemungutan suara pasti bekerja untuk saya. Masalah yang saya miliki adalah dengan sertifikat ssl yang saya tanda tangani sendiri untuk pengembang lokal. Saya harus menambahkan rejectUnauthorized: process.env.NODE_ENV === 'production' ke konfigurasi socket.io untuk membuatnya berfungsi. Saya mendapatkan 503 sebaliknya.

Masalah pekerja web adalah nyata. socketio/engine.io-client#569

coba ini

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

Terima kasih saya akan mencobanya
----- Pesan asli -----
Dari: pemberitahuan [email protected]
Penerima: "socketio/socket.io-client" [email protected]
Cc: Wangzhiqiang [email protected] , Komentar [email protected]
Subjek: Re: [socketio/socket.io-client] Kesalahan Polling XHR muncul saat debugger hadir (#1097)
Tanggal: 16:22, 20 Mei 2017

coba ini
membutuhkan('socket.io-client')('http://localhost', {
tolakTidak sah: salah,
})


Anda menerima ini karena Anda berkomentar.
Balas email ini secara langsung, lihat di GitHub, atau matikan utasnya.

Saya memiliki masalah yang sama. Kemudian saya mengubah kode klien saya menjadi

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

Tapi sekarang, saya mendapatkan respons kesalahan 404. Log menunjukkan bahwa ada tambahan /socket.io/ ditambahkan ke url permintaan saya.

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

Bagi saya itu muncul bahkan jika debugger tidak ada

Hai! saya memiliki masalah yang sama ketika saya mencoba untuk terhubung dari aplikasi Node.js ke server, inilah kode saya:

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

Log yang saya jalankan DEBUG=engine* npm run dev adalah seperti ini:

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

Ketika saya mencoba terhubung dari browser ke https://domain.com/socket.io/socket.io.js berhasil dan menggunakan io('https://domain.com') juga, jadi saya mengikuti instruksi di komentar dan saya mengubah kode saya menjadi:

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

Dan itu berhasil, tetapi aneh, saya memiliki sertifikat yang valid dari Let's Encrypt , atau itu normal? anyway.. saya menambahkan opsi transports (dari komentar juga) untuk menghindari koneksi lain selain websocket dan pada akhirnya kodenya adalah:

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

Terima kasih @ibrahimduran dan @SupremeTechnopriest :smile:

Saya minta maaf jika saya menulis seperti Tarzan :sweat_smile: saya sedang mengerjakan bahasa Inggris saya haha

Saya mengalami masalah ini dan saya menghabiskan 2 jam untuk ini, ternyata itu hanya menentukan opsi Anda dengan benar. Inilah cara Anda harus menentukannya:

   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] Jika Anda tidak menentukan apakah akan menggunakan http atau https , defaultnya adalah https . Atau jika Anda tidak menentukan port tepat setelah url sebagai "url. Com: port " default ke 80 atau 443 tergantung pada protokol. Saya telah melihat beberapa jawaban stackoverflow yang memiliki port yang ditentukan sebagai opsi di objek opsi. Saya telah melihat ke dalam kode dan tidak ada opsi seperti itu. Anda harus menyertakan port di url.

[2] Dan juga, saya mengatur agen ke true dan gagal membuat koneksi ws dan tidak ada kesalahan, itu hanya waktu habis. Hanya tidak menentukan agen sama sekali. Ini default ke salah.

@teja42 Saya mencoba memperbaiki masalah ini selama 2 hari. Saya pikir itu adalah masalah bundling dengan webpack tetapi solusi Anda bekerja dengan sangat baik. Terima kasih!

Hai !

Saya memiliki masalah yang sama dan memperbaiki penurunan versi dari 2.0.1 ke 1.7.4 seperti yang dikatakan @SupremeTechnopriest dan semuanya berfungsi dengan baik!

Terima kasih !

Hai, saya masih mengalami masalah ini saat mencoba Android 8.1 :(

Kode semu:
```
this.socket = io.connect('https://xxxxxxxxxxxxxx', {
jalur: '/socketchannel',
rekoneksiDelay: 1000,
koneksi ulang: benar,
upaya penyambungan kembali: 10,
mengangkut: ['websocket'],
agen: palsu,
peningkatan: salah,
tolakTidak sah: salah
});

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

```
Aplikasi masuk ke acara 'connection_error' dan mencatat "Error: websocket error"

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

Ada saran?

Aplikasi masuk ke acara 'connection_error' dan mencatat "Error: websocket error"

Menghadapi masalah yang sama

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

Saya menghadapi masalah yang sama, apakah ada pembaruan?

+1 untuk itu

Saya mengalami masalah ini karena origins dari server soket.
Jadi sekarang bagaimana cara menambahkan origin?

Halo semua. Jadi saya menggunakan cluster PM2 untuk server node express saya dan menggunakan adaptor redis:

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

Untuk klien browser ini tampaknya baik-baik saja, tetapi untuk socket.io-client saya mendapatkan:

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

Jika saya mengubah kode klien untuk menggunakan transportasi websocket, semuanya berfungsi dengan baik.

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

Masalahnya adalah saya tidak ingin kode ini diubah ke semua kode klien.

Rekomendasi saya adalah mengubah socket.io-client untuk mencoba transportasi websocket jika transportasi polling xhr gagal. Bagaimana menurut anda?

coba versi terakhir dari github, seperti ini, selesaikan masalah saya dengan RN Android:

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

Bersulang

Saya tahu solusi ini akan terdengar agak aneh, tapi saya sampai di sini dengan googling kesalahan ini.

Dalam kasus saya, saya mendapatkan ini karena server saya tidak berjalan (saya pikir itu). Semoga itu membantu orang lain :)

coba ini

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

Terima kasih, saya mengalami masalah untuk terhubung ke server saya dari aplikasi node dan solusi ini bekerja dengan baik untuk saya.

coba ini

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

Terima kasih, saya mengalami masalah untuk terhubung ke server saya dari aplikasi node dan solusi ini bekerja dengan baik untuk saya.
Halo, saya hanya ingin tahu versi socket.io dan socket.io-client mana yang Anda gunakan

coba ini

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

Terima kasih, saya mengalami masalah untuk terhubung ke server saya dari aplikasi node dan solusi ini bekerja dengan baik untuk saya.
Halo, saya hanya ingin tahu versi socket.io dan socket.io-client mana yang Anda gunakan

Saya menggunakan socket.io dan socket.io-client pada versi 2.3.0.

Hai, saya masih mengalami masalah ini saat mencoba Android 8.1 :(

Kode semu:

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

Aplikasi masuk ke acara 'connection_error' dan mencatat "Error: websocket error"

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

Ada saran?

Masalah yang sama. Apakah Anda menyelesaikannya?

Saya menyelesaikan masalah saya dengan menggunakan nama domain.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat