我正在使用 node.js (10.23) https lib 向第三方网络服务发送请求。一切似乎都很好,但最近我发现了一个让我感到困惑的奇怪问题。
这是代码:
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) 事务是一个请求和一个响应,怎么可能是一个请求,却可能得到两个响应。
我检查了node.js官方文档,上面写着
如果在请求期间遇到任何错误(可能是 DNS 解析、TCP 级别错误或实际 HTTP 解析错误),则会在返回的请求对象上发出“错误”事件。
所以我想也许http(s)请求和响应工作正常并且错误发生在'TCP级别',但为什么回调被调用两次?