当前位置: 首页 > 知识库问答 >
问题:

Heroku上的node.js socket.io抛出H13

裘嘉木
2023-03-14

在Heroku上部署我的应用程序破坏了websockets协议。
它在localhost上工作,而不是在Heroku上。在浏览器中,我得到:

到'wss:/node-omi.herokuapp.com/socket.io/?eio=2&transport=WebSocket&sid=*'的WebSocket连接失败:WebSocket握手期间出错:意外响应代码:503

在服务器端,我获得日志:

2014-08-12T15:05:24.761611+00:00 Heroku[router]:at=error code=h13 desc=“Connection closed with response”method=get path=“/socket.io/?eio=2&transport=websocket&sid=****”host=node-omi.herokuapp.com request_id=*fwd=“*”dyno=web.1 connect=3ms service=3ms status=503 bytes=864

这是我的服务器脚本的一部分:

var express = require('express'),
    http = require('http'),
    socket_io = require('socket.io');
var app = express(),
    server = http.Server(app),
    io = new socket_io(server).of('/test');
io.on('connection', this.connection.bind(this));
app.get('/client.html', function(req, res, next) { ... });
app.use('/', express.static(__dirname + '/public', {'index': ['index.html']}));
server.listen(process.env.PORT || 5000);

我的代码怎么了?有人成功地用Express4.8.3和Socket.io 1.0.6构建Socket.io服务器吗?套接字与轮询一起工作,但我确实需要websockets才能工作。谢谢回复。

共有1个答案

锺超英
2023-03-14

Heroku上的Websocket支持从beta到正式支持,所以在写这篇文章的时候,修复程序可能只是labs:enable websockets,但您应该不再需要这样做了,您就可以获得现成的websockets了。

警告!

但作为对阅读此问题的其他人的一个警告,在Heroku上使用socket.io可能会有问题,因为在粘性会话方面存在分歧

Heroku明确反对它们,但是(除了下面描述的一个相当糟糕的解决办法)socket.io需要它们:

https://github.com/automattic/engine.io/issues/261

^TL;DR如果这个非常长的线程是在V1.0之前,socket.io可以与Heroku这样的非粘性服务一起工作,那么您只需要使用一个redis适配器来管理Dynos上的共享状态。这在1.0中被删除了,socket.io团队担心会因为代码维护成本而把它放回去。github要求收回它的问题已经结束,并传达了这样一个信息:一旦有人非常想要它来做公关,他们会很乐意调查它。

变通办法!

有一个解决办法是将socket.io限制为只使用websocket传输,这不需要粘性会话。例如:

服务器

io.set('transports', ['websocket']);

客户

var socket = io.connect(host, {
    transports: ['websocket']
});

但是,这消除了Socket.io1.0使用Engine.io带来的许多好处。

还有其他websocket框架,如Faye,在Heroku上工作得非常好。

 类似资料:
  • 我一整天都在尝试让我的Nginx/React应用程序连接到我的Node.js后端,它在我的开发环境中工作得很好。我的前端和后端部署在同一个虚拟机上各自的Docker容器中。Nginx容器可以直接与Node.js容器通信,它被确认工作正常,因为其他get/post请求工作正常。 这是我最初的Nginx配置。 这是我在控制台上看到的错误: < code > POST http://domain _ n

  • 我在设置socketIO 1.1以在Heroku上工作时遇到了问题。我在运行Express V4.2。socketio在localhost上运行得很好。然而,在Heroku上,它给出了这个错误: 来自Heroku日志: 从浏览器: 我遵循了套接字IO文档中推荐的配置。相关代码如下: 在我的客户端文件中,脚本如下: 我还尝试了io.connect到、和我的Heroku应用程序域。它们都会产生相同的错

  • 我用Node.js设置了Socket.io,它通过侦听/连接到端口8000(或另一个不是服务器运行端口的端口)在本地开发机器上工作。 当我试图在heroku上做同样的事情时,客户端脚本导入失败了。 我尝试过相对路径 编辑:我实际上是在使用geddy mvc框架,我想让它在heroku上如何设置(基本上就像socket.io一样),我发现这个答案让我看起来可以类似地使用它:GeddyJS&socke

  • 我在Heroku上托管了这个java discordbot,升级到最新版本的JDA后,我不得不将更改为。当从intellij运行我的机器人时,它可以毫无问题地工作,但从Heroku执行它时,它会给我“java.lang.NoSuchmetodError:'net.dv8tion.jda.api.entities.AudioChannelnet.dv8tion.jda.api.entities.Gu

  • 问题内容: 我有一个集合和一个数组。我试图将数组转换为集合c2并执行操作,但这会抛出异常。我发现,类收益类和这个类继承自其实现抛出。 有什么办法可以删除元素?请帮忙 问题答案: 返回数组的包装器。此包装具有固定的大小,并直接由数组支持,因此对的调用将修改数组,而修改列表的任何其他方法都将引发。 要解决此问题,你必须通过复制包装器列表的内容来创建新的可修改列表。通过使用ArrayList带有的构造函

  • 我使用Intellij思想,当我去生成JavaDocs(通过Tools->generate JavaDoc)时,我会被抛出一个IllegealArgumentException,其中没有关于哪里出错的信息。 当使用模块中的每个单独文件进行测试时,即使没有JavaDoc注释,也会发生这种情况。 使用Java8和IntelliJ IDEA 2016.1.1