Socket.io-client: Ошибка опроса XHR появляется при наличии отладчика

Созданный на 13 апр. 2017  ·  30Комментарии  ·  Источник: socketio/socket.io-client

Вы хотите:

  • [x] сообщить об ошибке
  • [] запросить функцию

Текущее поведение

У меня возникли проблемы при попытке установить соединение с веб-сокетом на react-native. Я не уверен, поддерживается эта платформа или нет, однако эта ошибка воспроизводится в обычном приложении node.js. Как ни странно, у меня проблемы только тогда, когда встроенный отладчик response-native отключен . Я тестирую это на iOS 10.2 с react-native v0.43.1 и socket.io-client v1.7.3 . На моем сервере работает socket.io v1.7.2 размещенный на HTTP-порту 1337.

Действия по воспроизведению (если текущее поведение является ошибкой)

Как только я реализую socket.io-client в response-native и попытаюсь установить соединение без включенного отладчика, он должен воспроизвести с двумя ошибками в зависимости от параметров. Если я не укажу свой вариант транспорта, ошибка будет XHR: POLLING ERROR . Если я укажу «websocket» в моей опции транспорта, тогда ошибка станет WEBSOCKET ERROR . Это все, что я получил.

Ожидаемое поведение

Регулярное подключение к моему серверу через веб-сокет. Работает с включенным отладчиком.

Настраивать

  • ОС: OSX El Capitan 10.11.6
  • браузер: я считаю, что в response-native используется webkit, но я не уверен.
  • версия socket.io: указана выше

Другая информация (например, трассировки стека, связанные проблемы, предложения по исправлению)

Единственная другая проблема, связанная с этой, которую я обнаружил, - это №1056, и я удивлен тем, насколько странно связаны эти проблемы. Я повторил сценарий в обычном приложении node.js и испытал аналогичные результаты, однако ошибки были более подробно описаны, как показано ниже.

Без указанной опции транспорта:

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

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

Также имейте в виду, что браузер-клиент socket.io работает безупречно, подключаясь к этому конкретному веб-серверу.

Я пробовал разные сети, провайдеры и даже VPN. Я не понимаю на данный момент.

Самый полезный комментарий

Я решил свою проблему неделю назад путем рефакторинга, но не помню, что именно решило проблему. Извините за это, у меня была загруженная неделя, и это была первая фиксация.

Вы можете попробовать установить opts.transports только на websocket в клиенте:

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

У меня была слишком сложная логика привязки сокетов и действий, прежде чем я реорганизовал код. Поэтому убедитесь, что логика сокета в вашем коде работает, и упростите отладку.

Все 30 Комментарий

ОБНОВЛЕНИЕ : после окончательного тестирования одного из моих приложений на моем iPhone с помощью socket.io-client мне повезло, что я не столкнулся с ошибкой опроса XHR. Однако я все еще испытываю эту ошибку в обычном приложении узла.

В настоящее время у меня такая же проблема с моим приложением узла. Я использую встроенный сервер socket.io, и, похоже, он отлично работает в браузере, но в приложении узла socket.io-client выдает ту же ошибку опроса 503 xhr, указанную выше. Я запускаю сервер и клиент на одном компьютере, но подключение к петлевому или локальному сетевому адресу из клиентского приложения не работает. Я использую версию 1.7.3 как socket.io и socket.io-client .

Я также вижу эту ошибку в версии 2.0.1 (клиент и сервер) при запуске с узла.

Я решил свою проблему неделю назад путем рефакторинга, но не помню, что именно решило проблему. Извините за это, у меня была загруженная неделя, и это была первая фиксация.

Вы можете попробовать установить opts.transports только на websocket в клиенте:

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

У меня была слишком сложная логика привязки сокетов и действий, прежде чем я реорганизовал код. Поэтому убедитесь, что логика сокета в вашем коде работает, и упростите отладку.

Я попробую наш транспорт. На данный момент я понизил версию до 1.7.4, и, похоже, все работает.

Да, я уменьшил версию с 2.0.1 до 1.7.4, исправил это

Итак, я вернулся к 2.0.1 и настроил свой клиент на использование только транспорта websocket. Это (почти) работает:

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

Теперь моя единственная проблема заключается в том, что транспорт веб-сокетов не работает для областей действия веб-воркеров. Я думаю, что обнаружил проблему и открыл соответствующую проблему на engine.io-client здесь https://github.com/socketio/engine.io-client/issues/569

Выдается ли какая-нибудь ошибка? Не могли бы вы запустить с включенной отладкой? ( DEBUG=engine* )

Что касается response-native, это может быть связано с https://github.com/socketio/socket.io-client/issues/1114.

@darrachequesne Итак, я только что вернулся к транспорту по умолчанию в клиентском компоненте на стороне сервера. Моя ошибка там ... Транспорт для голосования определенно у меня работает. Проблема, с которой я столкнулся, заключалась в моих самоподписанных сертификатах ssl для местного разработчика. Мне пришлось добавить rejectUnauthorized: process.env.NODE_ENV === 'production' в конфигурацию socket.io, чтобы он заработал. В противном случае я получал 503 .

Однако проблема веб-воркеров реальна. socketio / engine.io-client # 569

попробуй это

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

Спасибо попробую
----- Исходное сообщение -----
От: Zetsin [email protected]
Получатель: "socketio / socket.io-client" [email protected]
Копия: Wangzhiqiang [email protected] , комментарий [email protected]
Тема: Re: [socketio / socket.io-client] Ошибка опроса XHR появляется при наличии отладчика (# 1097)
Дата: 16:22, 20 мая 2017 г.

попробуй это
require ('socket.io-client') ('http: // localhost', {
rejectUnauthorized: ложь,
})

-
Вы получили это, потому что прокомментировали.
Ответьте на это письмо напрямую, просмотрите его на GitHub или отключите обсуждение.

У меня такая же проблема. Затем я меняю свой клиентский код на

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

Но теперь я получаю ответ об ошибке 404. Журнал показывает, что к моему URL-адресу запроса добавлен дополнительный /socket.io/ .

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

Для меня это появляется, даже если отладчика нет

Привет! У меня была такая же проблема, когда я пытался подключиться из приложения Node.js к серверу, вот мой код:

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

Журнал, который я получил при запуске DEBUG=engine* npm run dev был примерно таким:

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

Когда я попытался подключиться из браузера к https://domain.com/socket.io/socket.io.js это сработало, и я тоже использовал io('https://domain.com') , поэтому я выполнил инструкции в комментариях и изменил свой код на:

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

И это сработало, но это странно, у меня есть действующие сертификаты от Let's Encrypt , или это нормально? в любом случае ... я добавил параметр transports (тоже из комментариев), чтобы избежать других подключений, кроме websocket и в конце код был:

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

Спасибо @ibrahimduran и @SupremeTechnopriest : smile:

Приношу свои извинения, если я писал как Тарзан: sweat_smile: я работаю над своим английским, ха-ха

У меня была эта проблема, и я потратил на это 2 часа, оказалось, что это просто правильное указание ваших параметров. Вот как их следует указать:

   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] Если вы не укажете, использовать http или https, по умолчанию будет https. Или, если вы не указываете порт сразу после URL-адреса как «url. Com: port », по умолчанию используется значение 80 или 443 в зависимости от протокола. Я видел несколько ответов stackoverflow, в которых порт указан в качестве параметра в объекте параметров. Я заглянул в код, но такой возможности нет. Вам необходимо указать порт в URL-адресе.

[2] Кроме того, я установил для агента значение true, и ему не удалось установить соединение ws, и ошибки не было, просто истекло время ожидания. Только не указывайте агента вообще. По умолчанию - false.

@ teja42 Я 2 дня пытался исправить эту проблему. Я думал, что это проблема с пакетом webpack, но ваше решение отлично сработало. Спасибо!

Привет !

У меня была та же проблема, и я исправил понижение с 2.0.1 до 1.7.4, как сказал @SupremeTechnopriest, и все работает нормально!

Благодарность !

Привет, у меня все еще проблема с Android 8.1 :(

Псевдокод:
`` ''
this.socket = io.connect ('https: // xxxxxxxxxxxxxx', {
путь: '/ socketchannel',
RenectionDelay: 1000,
переподключение: правда,
переподключениеПопыток: 10,
транспорты: ['websocket'],
агент: ложь,
обновление: ложь,
rejectUnauthorized: false
});

this.socket.on ('подключиться', () => {
console.log ('сокет подключен!')
})
this.socket.on ('connect_error', (err) => {
console.log ('ошибка подключения сокета ->' + err);
})

`` ''
Приложение переходит в событие 'connection_error' и регистрирует «Ошибка: ошибка веб-сокета».

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

Какие-либо предложения?

Приложение переходит в событие 'connection_error' и регистрирует «Ошибка: ошибка веб-сокета».

Столкнувшись с той же проблемой

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

Я столкнулся с той же проблемой, есть ли обновления?

+1 за это

У меня была эта проблема из-за origins сервера сокетов.
Итак, как добавить происхождение?

Всем привет. Итак, я использую кластер PM2 для своего экспресс-сервера node и использую адаптер redis:

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

Для браузерных клиентов это нормально, но для socket.io-client я получаю:

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

Если я изменю клиентский код для использования транспорта через веб-сокеты, все будет работать нормально.

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

Проблема в том, что я не хочу требовать изменения этого кода для всего клиентского кода.

Я рекомендую изменить socket.io-client, чтобы попытаться использовать транспорт websocket, если транспорт опроса xhr не работает. Что вы думаете?

попробуйте последнюю версию с github, вот так, решила мои проблемы с RN android:

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

Ваше здоровье

Я знаю, что это решение будет звучать немного странно, но я попал сюда, погуглил эту ошибку.

В моем случае я получал это, потому что мой сервер не работал (я думал, что это так). Надеюсь, что это поможет кому-то другому :)

попробуй это

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

Спасибо, у меня возникли проблемы с подключением к моему серверу из приложения узла, и это решение сработало для меня.

попробуй это

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

Спасибо, у меня возникли проблемы с подключением к моему серверу из приложения узла, и это решение сработало для меня.
Здравствуйте, мне просто интересно, какую версию socket.io и socket.io-client вы используете

попробуй это

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

Спасибо, у меня возникли проблемы с подключением к моему серверу из приложения узла, и это решение сработало для меня.
Здравствуйте, мне просто интересно, какую версию socket.io и socket.io-client вы используете

Я использую и socket.io, и socket.io-client версии 2.3.0.

Привет, у меня все еще проблема с Android 8.1 :(

Псевдокод:

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

Приложение переходит в событие 'connection_error' и регистрирует «Ошибка: ошибка веб-сокета».

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

Какие-либо предложения?

Та же проблема. Вы ее решаете?

Я решаю свою проблему, используя доменное имя.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги