node.js (10.23) https lib を使用して、サードパーティの Web サービスにリクエストを送信しています。すべて問題ないように見えますが、最近、私を混乱させる奇妙な問題を見つけました。
コードは次のとおりです。
var https = require('https');
function callWebService(requestOpts,body,accessToken,callback){
var options = {
host: requestOpts.host,
path: requestOpts.path,
method: 'POST',
headers: {
'Content-Type':'application/json',
'Content-Length': Buffer.byteLength(body),
'Authorization':'Bearer '+accessToken
}
};
var req = https.request(options, function(res) {
logger.log('STATUS: ' + res.statusCode);
logger.log('HEADERS: ' + JSON.stringify(res.headers));
if(res.statusCode!='200') {
var error = new Error("Web service call failed");
return callback(error);
} else {
logger.log('web service call success');
return callback();
}
});
req.on('error', function(e) {
logger.error('call web service,error occurs: ' + e.message);
return callback(e);
});
req.write(body);
req.end();
}
時々 (毎回ではありません)、ログに成功とエラーの両方が表示されます。エラーは「ECONNRESET の読み取り」です。なぜこれが起こるのかよくわかりません。
私の見解では、http(s) トランザクションは 1 つの要求と 1 つの応答です。
そして、node.jsの公式ドキュメントを確認したところ、
リクエスト中にエラーが発生した場合 (DNS 解決、TCP レベルのエラー、または実際の HTTP 解析エラーなど)、返されたリクエスト オブジェクトで「エラー」イベントが発行されます。
したがって、http(s) の要求と応答が正常に機能し、「TCP レベル」でエラーが発生する可能性があると思いますが、コールバックが 2 回呼び出されるのはなぜですか?