提问者:小点点

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


在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个答案

匿名用户

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上工作得非常好。