web-dev-qa-db-ja.com

読み取り時のNode.js HTTP GET "ECONNRESET"エラー

私はSOとGitHubでこのエラーについてすべての関連する問題を読みましたが、どれもこの状況に対処していないようです。

次のコードを実行すると:

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

次のエラーが発生します。

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

onread呼び出し以外のスタックトレースはないため、ネットのECONNRESETメソッドに渡されたonreadエラーコード(-54)以外の追加情報を取得する方法は不明です。 js

この問題はすべてのリクエストで発生します-断続的ではありません。

いくつかの観察:

  • chromeまたはpostmanから同じリクエストを行う場合、リクエストは失敗しません
  • 同じヘッダーを使用して、Chromeからの成功したリクエストを再現しようとすると失敗する
  • 「gzip」などを使用するようにAcceptヘッダーを設定しても役に立たない-これはGETリクエストであるにもかかわらず、コンテンツの長さの設定やリクエストへの本文の追加など、いくつかの奇妙な推奨事項を含め、すべての推奨事項を試してみました
    • エラーは常にnet.jsに表示されますが、リクエストライブラリとaxiosライブラリの両方で発生します

ここに興味深い部分があります-サーバーをローカルでホストしている場合にのみ、この問題を確実に再現できるようです。問題なくDockerコンテナーを介して、開発インスタンスに到達したり、サーバーをvagrantで実行したりできます。

MacOS Sierra 10.12.6を実行している場合、それが違いを生みます。サーバーはJava=で記述されており、Springフレームワークを使用しています。HTTP呼び出しに使用しているRestTemplate構成は次のとおりです。

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

私はこれらの設定をいじくり回してみました。

何か案は?

10
Jordan

これはNodeJSの既知の問題であり、解決されています。詳細は http.Agent:アイドルソケットが未処理のECONNRESETをスローする を参照してください。

MacOSで ポートを開く の場合、正しいセキュリティ設定が有効になっていることも確認してください

1
Ben Crowhurst