2012-09-24 24 views
17

błędu

Gdy użytkownik otworzy http://sync.aws.af.cm/, na wyświetlaczu konsoli JavaScript Google Chrome (w ciągu kilku sekund):Nieoczekiwany kod odpowiedzi: 502 Błąd podczas korzystania socket.io z AppFog

Unexpected response code: 502 error 

aplikację powinien pamiętać zawartość obszaru tekstowego nawet po odświeżeniu strony przez użytkownika. Aplikacja działa lokalnie, ale nie po przesłaniu jej do AppFog i podejrzewam, że problem dotyczy błędu 502.

Czy wiesz, co może powodować ten błąd w tym przypadku?

Co Próbowałem

Próbowałem zmieniając ścieżkę w moim klientem script src=<path_to_socket_io> z /socket.io/socket.io.js do node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js opisanym here, ale to nie pomogło.

Próbowałem też obsługiwać aplikację w Heroku zamiast AppFog, ale w tym przypadku ciągle działałem w opisanym problemie here, mimo że podałem plik socket.io w wersji 0.9.6.

Przyjrzałem się także następującym pytaniom, ale komentarze do tej pory nie wydają mi się pomocne.

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

odpowiedni kod serwera

Oto odpowiedni kod serwera:

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

odpowiedni kod klienta

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

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

log serwera

$ 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

ROZWIĄZANY: Jak opisano tutaj: http://stackoverflow.com/questions/11350279/socket-io-does-not-work-on-firefox-chrome Dodanie tego kodu rozwiązaniu problemu: io .configure ('development', function() { io.set ("transports", ['xhr-polling']); }); Ale nie rozumiem, dlaczego. Moje pytanie wydaje się być duplikatem istniejącego pytania. Jak zamknąć to pytanie i połączyć je z innym pytaniem? –

+0

To nie jest ten sam problem. W dzienniku Node.js możesz zobaczyć inne pytanie, że aplikacja wstrzymuje się przed połączeniami internetowymi, zanim spadnie z powrotem, podczas gdy twoja osoba od początku zgłasza nieprawidłowe połączenie. –

Odpowiedz

29

AppFog nie obsługuje jeszcze WebSockets. Po niedawnym przejęciu Nodester ogłosili, że nadejdzie za kilka miesięcy.

Po dodaniu io.set('transports', ['xhr-polling']); ustawiasz transport do długiego sondowania ajax. Domyślnie Socket.io określa najlepszy transport w oparciu o możliwości przeglądarki i bieżące połączenie. Websockets jest idealny, gdy jest dostępny, ale jeśli to nie Socket.io powróci do badania Xhr wśród innych transportów.

Sam otrzymałem ten sam błąd 502 unexpected response/bad gateway podczas korzystania z usługi CloudFlare, która nie może również pośredniczyć w połączeniach websocket za pośrednictwem infrastruktury opartej na nginxie (należy pamiętać, że od 2014 r. Cloudflare może pełnić rolę serwera proxy, jeśli korzystasz z abonamentu premium).

+0

W KOŃCU znalazłem, co się dzieje! Dziękuję bardzo za tę odpowiedź. – LordZardeck

+1

Dla tych, którzy używają CF, ta konfiguracja rozwiązuje ten sam problem w Cloudfoundry + Heroku. Dzięki Wes! – Gary

+0

Dzięki za nieco chmurki, pomogło mi to – GiveMeAllYourCats