1

我正在使用 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级别',但为什么回调被调用两次?

4

0 回答 0