关于node.js:意外的响应代码:将socket.io与AppFog一起使用时出现502错误

Unexpected response code: 502 error when using socket.io with AppFog

错误

当用户打开http://sync.aws.af.cm/时,将显示Google Chrome JavaScript控制台(几秒钟内):

1
Unexpected response code: 502 error

即使用户刷新页面,应用程序也应记住文本区域的内容。该应用程序在本地运行,但是当我将其上传到AppFog时无法运行,并且我怀疑问题是502错误。

您是否知道在这种情况下可能导致此错误的原因?

我尝试过的

我尝试按照此处所述将客户端中的script src=<path_to_socket_io>路径从/socket.io/socket.io.js更改为node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js,但这没有帮助。

我也尝试在Heroku而不是AppFog上提供该应用程序,但是在那种情况下,即使我指定了socket.io 0.9.6版,我仍然遇到这里描述的问题。

我也查看了以下问题,但到目前为止,这些评论似乎对我没有帮助。

socket.io在连接上创建502错误的网关/?? websocket无效

Socket.IO node.js websocket连接无效的端口8081

socket.io与node.js的运行不正常

相关服务器代码

这是相关的服务器代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var server = http.createServer(function (req, res) {
  ...
});

var io = require('socket.io').listen(server);

// Define events that can be triggered by the client
io.sockets.on('connection', function (socket) {
  socket.on('setServerVariable', function (value) {
    ...
  });
  ...
});

server.listen(process.env.VCAPP_APP_PORT || 3000);

相关客户代码

1
2
3
4
5
6
7
8
9
10
<script src="/socket.io/socket.io.js">


  window.onload = function () {
    ...
    var socket = io.connect(window.location.hostname);
    socket.emit('getServerVariable');
    ...
  };
...

服务器日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
$ af logs sync

====> /logs/stdout.log <====

info: socket.io started
debug: served static content /socket.io.js
debug: client authorized
info: handshake authorized veNnUVtoDTIz-oudG7Pa
debug: setting request GET /socket.io/1/websocket/veNnUVtoDTIz-oudG7Pa
debug: set heartbeat interval for client veNnUVtoDTIz-oudG7Pa
warn: websocket connection invalid
info: transport end (undefined)
debug: set close timeout for client veNnUVtoDTIz-oudG7Pa
debug: cleared close timeout for client veNnUVtoDTIz-oudG7Pa
debug: cleared heartbeat interval for client veNnUVtoDTIz-oudG7Pa
debug: served static content /socket.io.js
debug: client authorized
info: handshake authorized 6AKyhROUNjqujk_uG7Pb
debug: setting request GET /socket.io/1/websocket/6AKyhROUNjqujk_uG7Pb
debug: set heartbeat interval for client 6AKyhROUNjqujk_uG7Pb
warn: websocket connection invalid
info: transport end (undefined)
debug: set close timeout for client 6AKyhROUNjqujk_uG7Pb
debug: cleared close timeout for client 6AKyhROUNjqujk_uG7Pb
debug: cleared heartbeat interval for client 6AKyhROUNjqujk_uG7Pb
debug: setting request GET /socket.io/1/xhr-polling/6AKyhROUNjqujk_uG7Pb?t=1348504130465
debug: setting poll timeout
debug: client authorized for
debug: clearing poll timeout
debug: xhr-polling writing 1::
debug: set close timeout for client 6AKyhROUNjqujk_uG7Pb
debug: setting request GET /socket.io/1/xhr-polling/6AKyhROUNjqujk_uG7Pb?t=1348504130724
debug: setting poll timeout
debug: discarding transport
debug: cleared close timeout for client 6AKyhROUNjqujk_uG7Pb
debug: xhr-polling received data packet 5:::{"name":"getServerVariable"}
debug: clearing poll timeout
debug: xhr-polling writing 5:::{"name":"printLog"}
debug: set close timeout for client 6AKyhROUNjqujk_uG7Pb
server.js: getServerVariable:
debug: setting request GET /socket.io/1/xhr-polling/6AKyhROUNjqujk_uG7Pb?t=1348504130980
debug: setting poll timeout
debug: clearing poll timeout
debug: xhr-polling writing ?????????23?????????5:::{"name":"printLog"}?????????39?????????5:::{"name":"setItemValue","args":[""]}?????????23?????????5:::{"name":"printLog"}
debug: set close timeout for client 6AKyhROUNjqujk_uG7Pb
debug: discarding transport
debug: cleared close timeout for client 6AKyhROUNjqujk_uG7Pb
debug: setting request GET /socket.io/1/xhr-polling/6AKyhROUNjqujk_uG7Pb?t=1348504131261
debug: setting poll timeout
debug: discarding transport
debug: cleared close timeout for client 6AKyhROUNjqujk_uG7Pb
debug: clearing poll timeout
debug: xhr-polling writing 8::
debug: set close timeout for client 6AKyhROUNjqujk_uG7Pb
debug: xhr-polling closed due to exceeded duration
debug: setting request GET /socket.io/1/xhr-polling/6AKyhROUNjqujk_uG7Pb?t=1348504151659
debug: setting poll timeout
debug: discarding transport
debug: cleared close timeout for client 6AKyhROUNjqujk_uG7Pb


AppFog还不支持websocket。在最近收购Nodester之后,他们宣布它将在几个月后上市。

通过添加io.set('transports', ['xhr-polling']);,您只是将传输设置为ajax长轮询。默认情况下,Socket.io根据浏览器功能和当前连接确定最佳传输方式。如果可用,Websockets是理想的选择,但是如果没有,Socket.io将回退到其他传输方式中的xhr-polling。

我在使用CloudFlare时遇到了同样的502 unexpected response / bad gateway错误,该错误也无法通过其基于nginx的基础架构代理websocket连接(请注意,从2014年开始,如果您使用高级计划,Cloudflare可以代理websockets) 。