2013-10-10 4 views
41

Chciałbym poznać przyczynę zamknięcia stron internetowych, dzięki czemu mogę wyświetlić odpowiednią wiadomość dla użytkownika.powód zamknięcia zamkniętych stron internetowych z kodem zamkniętym 1006

mam

sok.onerror=function (evt) 
    {//since there is an error, sockets will close so... 
     sok.onclose=function(e){ 
      console.log("WebSocket Error: " , e);} 

Kod jest zawsze 1006 a powodem jest zawsze "". Ale chcę odróżnić różne przyczyny zamknięcia.

Na przykład linia komand podaje przyczynę błędu: "nie można tego usunąć, ponieważ baza danych nie pozwala". Ale na konsoli Chrome powodem jest nadal "".

W inny sposób odróżnić różne przyczyny zamknięcia?

Odpowiedz

69

Close Code 1006 to specjalny kod, który oznacza, że ​​połączenie zostało nieprawidłowo zamknięte (lokalnie) przez implementację przeglądarki.

Jeśli Twój klient przeglądarki zgłasza zamknięty kod 1006, powinieneś zobaczyć szczegóły wydarzenia websocket.onerror(evt).

Jednak Chrome rzadko zgłasza dowolny bliski kod 1006 powodów po stronie javascript. Jest to prawdopodobnie spowodowane regułami bezpieczeństwa klienta w specyfikacji WebSocket, aby zapobiec nadużywaniu websocket. (takie jak używanie go do skanowania otwartych portów na serwerze docelowym lub do generowania wielu połączeń dla ataków typu DoS).

Pamiętaj, że Chrome często zgłasza bliski kod 1006, jeśli wystąpi błąd podczas uaktualniania HTTP do Websocket (jest to krok, zanim websocket jest technicznie "podłączony"). Z powodów takich, jak złe uwierzytelnienie lub autoryzacja, lub złe użycie protokołu (takie jak żądanie subprotocol, ale sam serwer nie obsługuje tego samego podklucza), lub nawet próba rozmowy z lokalizacją serwera, która nie jest plikiem sieci Web (takie jak próby połączenia z ws://images.google.com/)

Zasadniczo, jeśli widzisz ścisły kod 1006, masz błąd poziom bardzo niski ze sobą websocket (podobny do „nie można otworzyć pliku” lub „Socket Error”), nie bardzo przeznaczone dla użytkownika, ponieważ wskazuje na niski poziom problemu z kodem i implementacją. Napraw problemy o niskim poziomie, a kiedy już się połączysz, możesz dodać bardziej sensowne kody błędów. Możesz to osiągnąć pod względem zakresu lub powagi w swoim projekcie. Przykład: poziom informacji i ostrzeżenia jest częścią specyficznego protokołu twojego projektu i nie powoduje przerwania połączenia. Z poważnymi lub fatalnymi wiadomościami raportującymi również za pomocą protokołu twojego projektu, aby przekazać tyle szczegółów, ile chcesz, a następnie zamknięcie połączenia przy użyciu ograniczonych możliwości websocket close flow.

Należy pamiętać, że kody zakończenia WebSocket są ściśle określone, a powód fraza/wiadomość powodująca błąd nie może przekraczać 123 znaków (jest to zamierzone ograniczenie dla stron internetowych).

Ale nie wszystko jest stracone, jeśli po prostu potrzebujesz tych informacji do debugowania, szczegóły zamknięcia i jego przyczyny są często zgłaszane z dużą ilością szczegółów w konsoli javascript przeglądarki Chrome.

+2

Joakim, dzięki, bardzo szczegółowe anser. Jeśli używam 'sok.onerror = function (evt) {console.log (evt);}' szczegóły nie są tak wiele. Nawet "rozum" czy coś takiego. A więc żadnych opcji? Po prostu pokazuję użytkownikowi, że coś jest nie tak lub nie jest połączone? Nie tak przyjazny dla użytkownika, byłoby miło, gdyby użytkownik mógł zobaczyć "Nie można usunąć, powodują ograniczenia bazy danych". Jakieś opcje? Dzięki – slevin

+0

Powinieneś użyć 'sok.onclose' zamiast tego, który wyzwala 'close event', ma' reason' i 'code' w nim –

+0

@IhabKhattab, który byłby ściśle związany z kodem, a także po zamknięciu. mając 'sok.onclose' będzie działać dla wielu ścieżek, ale nie dla wszystkich ścieżek. Zwłaszcza zły protokół, złe błędy uzgadniania (takie jak niektóre warunki, które mogą powodować zamknięcie kodu '1006'). Czy to zmieni się w przyszłości? Prawdopodobnie. Ale kiedy ta odpowiedź została napisana, była to prawda. –

Powiązane problemy