以下のコードで奇妙な動作が見られます。
cb1 は、リクエスト req が成功したときに呼び出されます。その後、cb2 も呼び出されますが、これは正しくないようです。
var result = {};
// populate options object
var req = https.request(options, function(response) { // cb1
callback(null, result);
});
req.on('error', function(err) { // cb2
callback(err, result);
});
req.setTimeout(30000); // 5 mins
req.setNoDelay(true);
if (requestBody) {
req.write(requestBody);
}
req.end();
https リクエストがすでに成功している場合 ( cb1 でresponse.statuscodeが 200 に設定されている)、同じリクエスト オブジェクトで「エラー時」ハンドラを後で呼び出すことは可能ですか?
cb2 関数は次のように呼び出されます
エラー: ECONNRESET を読み取ってください
私の想定では、これは決して起こらないはずだったので、「コールバック」にはコードがあり、同じ着信要求に対して 2 回呼び出されると、サーバーがクラッシュします。
また、https モジュールでは以下の 2 つの設定を使用しています。
https.globalAgent.maxSockets = 65000;
https.globalAgent.keepAlive = true;
keepAlive 設定が何らかの形でバックエンド サーバーへの接続を維持している可能性はありますか? サーバーがこの接続を終了すると、同じ req オブジェクトで cb2 が再度呼び出されますか?