web-dev-qa-db-fra.com

Node.js HTTP GET "ECONNRESET" Erreur lors de la lecture

J'ai lu toutes les questions liées sur SO et GitHub à propos de cette erreur et aucune d'entre elles ne semble résoudre cette situation.

Quand je lance le code suivant:

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

Je reçois l'erreur suivante:

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

Il n'y a pas de trace de pile au-delà de l'appel onread. Il est donc difficile de savoir comment obtenir des informations supplémentaires au-delà du code d'erreur ECONNRESET (-54) transmis à la méthode onread dans net.js.

Ce problème se produit avec chaque demande - il n'est pas intermittent.

Quelques observations:

  • lors de la demande identique de chrome ou de facteur, la demande n'échoue PAS
  • toute tentative de reproduction d'une requête réussie de Chrome à l'aide des mêmes en-têtes échoue
  • régler l'en-tête d'acceptation pour utiliser 'gzip', etc. n'aide pas - j'ai essayé toutes les recommandations, y compris certaines étranges, comme définir la longueur du contenu et ajouter un corps à la requête, même s'il s'agissait d'une requête GET
    • l'erreur apparaît toujours dans net.js, mais se produit à la fois avec les bibliothèques request et axios

Voici la partie intéressante - Je ne peux sembler reproduire ce problème de manière fiable que lorsque j'héberge le serveur localement . Je peux atteindre l'instance de dev ou exécuter le serveur dans vagrant, via un conteneur de docker, sans problème.

J'utilise macOS Sierra 10.12.6 si cela fait une différence. Le serveur est écrit en Java et utilise le framework Spring. Voici la configuration RestTemplate que j'utilise pour les appels 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);
}

J'ai essayé de déconner avec ces paramètres sans succès.

Des idées?

8
Jordan

Ce problème connu de NodeJS a été résolu. Veuillez consulter http.Agent: les sockets inactifs jettent ECONNRESET non géré pour plus de détails.

Vérifiez également que vous avez activé les paramètres de sécurité appropriés lorsque ouverture d’un port sur MacOS.

1
Corvusoft