web-dev-qa-db-de.com

Node.js HTTP GET “ECONNRESET” Fehler beim Lesen

Ich habe alle diesbezüglichen Probleme auf SO und GitHub über diesen Fehler gelesen, und keiner von ihnen scheint diese Situation zu lösen.

Wenn ich den folgenden Code ausführen:

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

Ich erhalte folgende Fehlermeldung:

{ 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...

Über den Aufruf von onread hinaus gibt es keine Stack-Ablaufverfolgung. Es ist also unklar, wie ich zusätzliche Informationen über den ECONNRESET-Fehlercode (-54) an die onread-Methode in net.js erhalten kann

Dieses Problem tritt bei jeder Anfrage auf - es ist nicht zeitweise.

Einige Bemerkungen:

  • Wenn dieselbe Anfrage von Chrome oder Postman gestellt wird, schlägt die Anfrage NICHT fehl.
  • der Versuch, eine erfolgreiche Anforderung aus Chrome mit denselben Kopfzeilen zu reproduzieren, schlägt fehl
  • das Festlegen des Accept-Headers für die Verwendung von 'gzip' usw. hilft nicht. Ich habe alle Empfehlungen ausprobiert, einschließlich einiger ungewöhnlicher Empfehlungen, z. .
    • der Fehler erscheint immer in net.js, tritt jedoch sowohl in der Request- als auch in der Axios-Bibliothek auf

Hier ist der interessante Teil - Ich kann dieses Problem nur zuverlässig reproduzieren, wenn ich den Server lokal hoste . Ich bin in der Lage, die dev-Instanz zu erreichen oder den Server in Vagrant über einen Docker-Container ohne Probleme auszuführen.

Ich verwende macOS Sierra 10.12.6, wenn das einen Unterschied macht. Der Server ist in Java geschrieben und verwendet das Spring-Framework. Hier ist die RestTemplate-Konfiguration, die ich für HTTP-Aufrufe verwende:

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

Ich habe versucht, mit diesen Einstellungen herumzulaufen, ohne Glück.

Irgendwelche Ideen?

8
Jordan

Dies war ein bekanntes Problem mit NodeJS und wurde behoben. Siehe http.Agent: Leerlaufbuchsen werfen unbehandeltes ECONNRESET für Details.

Stellen Sie außerdem sicher, dass Sie die korrekten Sicherheitseinstellungen aktiviert haben, wenn Sie einen Port öffnen unter MacOS

1
Corvusoft