Socket.io-client: 存在调试器时出现 XHR 轮询错误

创建于 2017-04-13  ·  30评论  ·  资料来源: socketio/socket.io-client

你想要:

  • [x] 报告错误
  • [ ] 请求一个功能

当前行为

我在尝试在 react-native 上建立网络套接字连接时遇到了麻烦。 我不确定是否支持此平台,但是,此错误可在常规 node.js 应用程序上重现。 奇怪的是,我只有在 react-native 的内置调试器被禁用时才会遇到麻烦。 我正在 IOS 10.2 上使用react-native v0.43.1socket.io-client v1.7.3对此进行测试。 我的服务器运行socket.io v1.7.2托管在 HTTP 端口 1337 上。

重现步骤(如果当前行为是错误)

一旦我在 react-native 中实现socket.io-client没有启用调试器的XHR: POLLING ERROR 。 如果我在我的传输选项中指定 'websocket' 那么错误会变成WEBSOCKET ERROR 。 这就是我得到的。

预期行为

到我的服务器的常规网络套接字连接。 它与启用的调试器一起工作。

设置

  • 操作系统:OSX El Capitan 10.11.6
  • 浏览器:我相信 react-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 的基于浏览器的客户端可以完美地连接到这个特定的 Web 服务器。

我尝试过各种不同的网络、ISP 甚至 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 poll 错误。 我在同一台机器上运行服务器和客户端,但从客户端应用程序连接到环回或本地网络地址不起作用。 我正在使用socket.iosocket.io-client版本1.7.3 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
});

现在我唯一的问题是 web 工作者范围的 websocket 传输被破坏。 我想我已经确定了问题并在engine.io-client上打开了一个相应的问题https://github.com/socketio/engine.io-client/issues/569

是否有任何错误抛出? 您可以在启用调试的情况下运行吗? ( DEBUG=engine* )

关于 react-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,
})

Thanks I'll try it
----- 原始邮件 -----
发件人:Zetsin [email protected]
收件人:"socketio/socket.io-client" [email protected]
抄送人:Wangzhiqiang [email protected], Comment [email protected]
主题:Re: [socketio/socket.io-client] XHR Polling Error appears when debugger is present (#1097)
日期:2017年05月20日 16点22分

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


You are receiving this because you commented.
Reply to this email directly, view it on GitHub, or mute the thread.

我有同样的问题。 然后我将我的客户端代码更改为

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指定为以后的端口正确“的网址。的COM:端口”默认为80或443取决于协议。 我见过一些 stackoverflow 的答案,这些答案将端口指定为选项对象中的一个选项。 我查看了代码,没有这样的选项。 您需要在 url 中包含端口。

[2] 而且,我将代理设置为 true 并且它无法建立 ws 连接并且没有错误,它只是超时。 只是根本不指定代理。 它默认为假。

@teja42我尝试解决这个问题 2 天。 我认为这是 webpack 的一个捆绑问题,但您的解决方案非常有效。 谢谢!

你好 !

我遇到了同样的问题并修复了从 2.0.1 降级到 1.7.4 的问题,正如@SupremeTechnopriest所说,一切正常!

谢谢 !

嗨,我在 Android 8.1 上尝试时仍然遇到这个问题:(

伪代码:
``
this.socket = io.connect('https://xxxxxxxxxxxxxx', {
路径:'/socketchannel',
重新连接延迟:1000,
重新连接:真,
重新连接尝试:10,
传输:['websocket'],
经纪人:假的,
升级:假,
拒绝未授权:假
});

this.socket.on('connect', () => {
console.log('套接字已连接!')
})
this.socket.on('connect_error', (err) => {
console.log('socket 连接错误 --> ' + err);
})

``
应用程序进入“connection_error”事件并记录“错误:websocket 错误”

“反应原生”:“0.57.4”,
“socket.io-client”:“1.7.4”

有什么建议?

应用程序进入“connection_error”事件并记录“错误:websocket 错误”

面临同样的问题

    "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 集群并使用 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 }

如果我更改客户端代码以使用 websocket 传输,则一切正常。

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

问题是我不想要求将此代码更改为所有客户端代码。

如果 xhr 轮询传输失败,我的建议是更改 socket.io-client 以尝试使用 websocket 传输。 你怎么认为?

尝试从 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

我在 2.3.0 版本中同时使用 socket.io 和 socket.io-client。

嗨,我在 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”事件并记录“错误:websocket 错误”

“反应原生”:“0.57.4”,
“socket.io-client”:“1.7.4”

有什么建议?

同样的问题,你解决了吗?

我通过使用域名解决了我的问题。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

BorntraegerMarc picture BorntraegerMarc  ·  4评论

patrickbussmann picture patrickbussmann  ·  6评论

najibghadri picture najibghadri  ·  7评论

catamphetamine picture catamphetamine  ·  3评论

ledmago picture ledmago  ·  3评论