【问题标题】:Socket.io bad request with response {"code":0,"message":"Transport unknown"}?带有响应 {"code":0,"message":"Transport unknown"} 的 Socket.io 错误请求?
【发布时间】:2014-07-19 17:54:51
【问题描述】:

我正在尝试运行 socket.io,但我得到了一堆这样的:

http://domain.com:8080/socket.io/?EIO=2&transport=polling&t=1401421022966-0 400 (Bad Request) 

这是我得到的回复:

{"code":0,"message":"Transport unknown"}

我找不到任何理由。我在某处读到它可能会误解客户,但这是我所能得到的。

【问题讨论】:

  • 您的网址格式似乎不正确。 socket.io 之后去掉斜线会改善你的情况吗?太棒了,它看起来像http://domain.com:8080/socket.io?EIO=2&transport=polling&t=1401421022966-0
  • 来自 socket.io 的文档,这里是 socket.io 默认传输:websocket、htmlfile、xhr-polling、jsonp-polling
  • @grobot 该 URL 没有任何格式错误。斜杠在 URL 中很常见,即使在末尾也是如此。

标签: javascript node.js socket.io http-status-code-400


【解决方案1】:

服务器端

试试这个配置

const io = require('socket.io')(server, { 科尔斯:{ 来源:“http://localhost:8100”, 方法:[“GET”,“POST”], 传输:['websocket','轮询'], 凭据:真 }, 允许EIO3:真 });

【讨论】:

  • 谢谢!我错过了allowEIO3: true
【解决方案2】:

我修复了它在我的 server.js 中的作用

io实例初始化如下:

const io = socket.listen(httpServer, { serveClient: true })

在我拥有{ serveClient: false } 之前,否则我会收到错误消息。但实际上,如果您希望您的客户端从节点实例中获取 io,您必须为其提供服务。

更新:最后..您只想拥有 const io = socket.listen(httpServer) 默认情况下,这种方式将是真实的。

【讨论】:

    【解决方案3】:

    我的解决方案是将 node.js 升级到最新版本(本文发布时为 0.12.0)。最初 node.js 是作为捆绑包的一部分安装的。一旦我卸载了来自该捆绑包的 node.js(Aptana 3 捆绑包,node.js 有点落后),并从 node.js 的网站安装了最新版本,事情终于开始工作了。

    我正在试验 React.js。我花了几个小时调试这个现象,我在 socket.io 中发现了构建错误,特别是关于 socket.io-client,它试图调用 Visual Studio MSBuild 失败。可悲的是,node-gyp 也发生了错误。显然 socket.io-client 不需要运行/提供我的示例,并且似乎可以忽略这些不幸的错误(将我引诱到无尽的森林中)。

    (我在安装 webpack-dev-server 时还注意到了一个模块,它仅适用于 Darwin(又名 Mac OS X)。幸运的是,这是一个可选依赖项。虽然这很可怕:我知道 Apple 非常时髦,但大多数世界不是 Mac。)

    【讨论】:

      【解决方案4】:

      从 0.9.x 升级到 1.x.x 后,我遇到了同样的问题。长话短说,我会将传输设置为 ['websocket', 'polling'] 然后错误...

      当您将服务器配置为使用特定传输时,您应该在客户端将相同的配置设置为...

      服务器

          var io = require('socket.io')(server, {'transports': ['websocket', 'polling']});
      

      客户

          var io = io( serverUri, {'transports': ['websocket', 'polling']});
      

      【讨论】:

      • 这些文件在哪里?
      • 我知道这已经晚了,在 2021 年,但让我谢谢你。我到处寻找,每个人总是通过匹配我已经拥有的客户端和服务器版本来解决问题。就我而言,一旦我在服务器上阻止了到 websocket 的传输,我就会收到错误的请求错误,因为客户端仍在尝试使用轮询!在客户端上声明传输也是如此!再次感谢!
      【解决方案5】:

      这发生在我自己提供 socket.io.js 脚本时。 我不得不将node_modules/socket.io/node_modules/socket.io-client/socket.io.js 复制到我提供它的地方。

      【讨论】:

      • 您能详细说明一下吗?
      • 这是不久前,但如果我没记错的话如果我的页面加载到 foo.com,但我连接到 bar.com 上的 websocket,我必须复制 socket.io.js文件到 foo.com 并从那里加载。我不知道该解决方案是否仍然有效,或者它是否是最好的方法。
      • 解决了我的问题!我使用的是旧版本,我在其中加载了本地版本,而不是直接从节点实例
      【解决方案6】:

      我也有同样的问题:

      获取最新的 socket-client.js 并在客户端使用这些文件,为我解决了这个问题。

      【讨论】:

      【解决方案7】:

      我遇到了同样的问题,从 0.9.x 升级后,我的服务器配置设置为 ['websocket', 'jsonp-polling'],这在 0.9 中有效,但客户端和服务器的默认配置现在是 ['polling', 'websocket']。 删除我的服务器配置让我启动并运行。

      配置现在记录在 engine.io (https://github.com/automattic/engine.io) 中,这是 1.0 中引入的新传输层 - 特别是这一行:
      transports ( String): transports to allow connections to (['polling', 'websocket'])

      【讨论】:

      • 你能告诉我服务器配置在哪里吗?我刚刚完全卸载了 node_modules 中的 socket.io 文件夹并重新安装,我仍然遇到这个问题。
      • 这修复了它!极好的。 @RiverTam 配置将在您的代码中某处。
      • 这个配置文件在哪里?
      • prntscr.com/g3ekl8 聊天工作正常,但 newrelic 记录了这一点。我还发现所有日志都来自 Windows NT 6.1,可能会尝试使用轮询任何建议进行连接
      猜你喜欢
      • 2015-08-23
      • 2019-09-26
      • 2021-12-16
      • 1970-01-01
      • 1970-01-01
      • 2019-12-18
      • 2019-11-02
      • 1970-01-01
      • 2013-03-04
      相关资源
      最近更新 更多