意外的响应代码:与AppFog使用socket.io时出现502错误

错误

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

Unexpected response code: 502 error 

应用程序应该记住文本区域的内容,即使用户刷新页面。 该应用程序在本地工作,但不是当我上传到AppFog,我怀疑问题是502错误。

你知道在这种情况下可能会导致这个错误吗?

我试过了

我尝试将script src=<path_to_socket_io>path在我的客户端从/socket.io/socket.io.jsnode_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js ,如此处所述,但没有帮助。

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

我也看了以下问题,但迄今为止的意见似乎并没有帮助我。

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

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

socket.io与node.js不按预期工作

相关的服务器代码

这里是相关的服务器代码:

 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); 

相关的客户端代码

 <script src="/socket.io/socket.io.js"></script> <script> window.onload = function () { ... var socket = io.connect(window.location.hostname); socket.emit('getServerVariable'); ... }; ... 

服务器日志

 $ 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根据浏览器function和当前连接来确定最佳传输。 Websockets是理想的,当它是可用的,但如果它不是Socket.io将回落到其他运输xhr轮询。

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