2012-09-24 27 views
17

El error

Cuando el usuario abre http://sync.aws.af.cm/, los programas de Google Chrome JavaScript Console (dentro de unos pocos segundos):código de respuesta inesperada: 502 error al utilizar socket.io con AppFog

Unexpected response code: 502 error 

La aplicación debe recordar el contenido del área de texto incluso después de que el usuario actualice la página. La aplicación funciona localmente, pero no cuando la cargo en AppFog, y sospecho que el problema es el error 502.

¿Sabes qué podría causar este error en este caso?

Lo que he tratado

He intentado cambiar la ruta de script src=<path_to_socket_io> en mi cliente /socket.io/socket.io.js-node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js como se describe here, pero no sirvió de nada.

También traté de servir la aplicación en Heroku en lugar de AppFog, pero en ese caso me encontré con el problema descrito here aunque especifiqué socket.io versión 0.9.6.

También he mirado las siguientes preguntas, pero los comentarios hasta ahora no parecen ayudarme.

socket.io creating 502 Bad Gateway on connect/websocket invalid

Socket.IO node.js websocket connection invalid port 8081

socket.io with node.js not working as expected

código de servidor pertinente

Aquí está el código del servidor relevante:

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

código de cliente Relevante

<script src="/socket.io/socket.io.js"></script> 

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

registro del servidor

$ 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 
+1

resolvió: Como se describe aquí: http://stackoverflow.com/questions/11350279/socket-io-does-not-work-on-firefox-chrome La adición de este código fijo el problema: io .configure ('desarrollo', función() { io.set ('transportes', ['xhr-polling']); }); Pero no entiendo por qué. Ahora, mi pregunta parece ser un duplicado de una pregunta existente. ¿Cómo cierro esta pregunta y la relaciono con la otra pregunta? –

+0

Este no es el mismo problema. Puede ver en el registro Node.js en la otra pregunta que la aplicación es el protocolo de enlace sobre websockets antes de retroceder, mientras que el suyo reclama una conexión no válida desde el inicio. –

Respuesta

29

AppFog no soporta websockets todavía. Tras su reciente adquisición de Nodester, anunciaron que llegaría en unos meses.

Al agregar io.set('transports', ['xhr-polling']);, solo está configurando el transporte a ajax de largo sondeo. De forma predeterminada, Socket.io determina el mejor transporte según las capacidades del navegador y la conexión actual. Websockets es ideal, cuando está disponible, pero si no es Socket.io recurrirá a xhr-polling entre otros transportes.

Recibí el mismo error 502 unexpected response/bad gateway al usar CloudFlare, que tampoco es capaz de hacer proxy de conexiones websocket a través de su infraestructura basada en nginx (tenga en cuenta que a partir de 2014, Cloudflare puede proxy websockets si está en un plan premium).

+0

¡FINALMENTE encontré lo que estaba pasando! Muchas gracias por esta respuesta. – LordZardeck

+1

Para aquellos que usan CF, esta configuración resuelve el mismo problema en Cloudfoundry + Heroku. Gracias Wes! – Gary

+0

Gracias por la nube nublada, me ayudó – GiveMeAllYourCats

Cuestiones relacionadas