2017-10-10 86 views
7

Przeczytałem wszystkie związane z tym problemy dotyczące SO i GitHub na temat tego błędu i żaden z nich nie wydaje się rozwiązać tej sytuacji.Node.js HTTP GET "ECONNRESET" Błąd odczytu

Kiedy uruchomić następujący kod:

response = await axios.get('http://localhost:8082/panda, { 
    httpAgent: new http.Agent({ keepAlive: true, keepAliveMsecs: 10000 }) 
}); 

pojawia się następujący błąd:

{ Error: socket hang up 
    at createHangUpError (_http_client.js:345:15) 
    at Socket.socketOnEnd (_http_client.js:437:23) 
    at emitNone (events.js:110:20) 
    at Socket.emit (events.js:207:7) 
    at endReadableNT (_stream_readable.js:1059:12) 
    at _combinedTickCallback (internal/process/next_tick.js:138:11) 
    at process._tickCallback (internal/process/next_tick.js:180:9) code: 'ECONNRESET' } 
{ Error: read ECONNRESET 
    at _errnoException (util.js:1019:11) 
    at TCP.onread (net.js:608:25) 
    code: 'ECONNRESET', 
    errno: 'ECONNRESET', 
    syscall: 'read', 
    etc... 

nie ma śladu stosu poza wezwanie onread więc jest jasne, jak mogę uzyskać żadnych dodatkowych informacji poza kod błędu ECONNRESET (-54) przekazany do metody onread w pliku net.js

Ten problem występuje przy każdym żądaniu t - nie jest przerywany.

Kilka obserwacji:

  • podczas dokonywania sam wniosek z Chrome lub listonosz wniosek nie powiedzie
  • próbując odtworzyć udane wniosek Chrome przy użyciu tych samych nagłówków, nie powiedzie
  • ustawienie nagłówka akceptującego do używania 'gzip' itp. Nie pomaga - próbowałem wszystkich zaleceń, w tym niektórych dziwnych, takich jak ustawianie długości treści i dodawanie treści do żądania, mimo że jest to żądanie GET
    • błąd pojawia się zawsze w net.js, ale dzieje się zarówno wniosek i Axios bibliotek

Oto interesująca część - mogę tylko wydają się odtworzyć ten problem niezawodnie, gdy jestem gospodarzem serwer lokalnie. Jestem w stanie dotrzeć do instancji dewelopera lub uruchomić serwer w vagrantach za pośrednictwem kontenera dokera, bez problemu.

Używam macOS Sierra 10.12.6, jeśli to robi jakąkolwiek różnicę. Serwer jest napisany w Javie i używa frameworka Spring. Oto konfiguracja RestTemplate używam dla połączeń HTTP:

@Bean 
public RestTemplate restTemplate() { 
    //request timeout 
    int timeout = 5000; 

    //Connection Pooling factory with timeouts to prevent disastrous request responses 
    HttpComponentsClientHttpRequestFactory cf = new HttpComponentsClientHttpRequestFactory(); 
    cf.setReadTimeout(timeout); 
    cf.setConnectTimeout(timeout); 
    cf.setConnectionRequestTimeout(timeout); 

    return new RestTemplate(cf); 
} 

Próbowałem aprowizacji z tych ustawień bez powodzenia.

Wszelkie pomysły?

+0

„Connection reset” błędy mogą wskazywać, że proces serwera hit problem (np rozbił). Czy przejrzałeś dzienniki dowolnego procesu serwera, do którego próbujesz się połączyć? –

+0

Testowałem to podczas debugowania procesu lokalnie - bez awarii i niczego w dziennikach ... Próbowałem dodać przechwytywacz do rejestrowania błędów, a także zmieniając różne poziomy rejestrowania w moim pliku application.properties - nie wydaje się, że jest to żądanie dociera do serwera – Jordan

+0

Jaką wersję węzła, etc ... używasz? – Corvusoft

Odpowiedz

1

To był znany problem z NodeJS i został rozwiązany. Szczegółowe informacje znajdują się pod adresem http.Agent: idle sockets throw unhandled ECONNRESET.

zapewniają również zostały włączone odpowiednie ustawienia zabezpieczeń, gdy opening a port na MacOS

+0

Widziałem ten problem, ale jeśli to zostało naprawione ponad rok temu, to myślę, że będzie to w najnowszych wersjach węzła 7 i 8 – Jordan

+0

ten problem będzie się dziać bez zapory sieciowej – Jordan

+0

Z ciekawości, co się stanie, gdy uruchomisz aplikacja pod rootem? – Corvusoft