Javascript Nodejs http请求不从递归函数调用

Javascript Nodejs http请求不从递归函数调用,javascript,node.js,Javascript,Node.js,我有一个奇怪的情况 我需要发送请求3次或直到我得到正确的答复 var connect = function(){ console.log('first step'); var connector = http.request(some_options, function(resp) { console.log('sec step'); resp.on("data", function(chunk){ str += chunk; });

我有一个奇怪的情况

我需要发送请求3次或直到我得到正确的答复

var connect = function(){ 

  console.log('first step');

  var connector = http.request(some_options, function(resp) {

    console.log('sec step');

    resp.on("data", function(chunk){
        str += chunk;
    });
    resp.on("end", function() {

      console.log('third step');

      if (resp.statusCode != 200){
        return false
      }
      else{
        var rep = 3;
        var i = 1;
        (function retry_connect(){                                          
           if ((i <= rep) && JSON.parse(str).hasOwnProperty('error')) {
             console.log('reconnect');
             connect();
             i++;
             setTimeout(function(){retry_connect()}, 3000);                             
           }
           else{
             return true
           }
        }());
      }
    });
  });
};

connect();
可以解释为什么不从retry_connect()函数调用连接器吗


谢谢

您的http请求可能会发出错误, 尝试添加:

connector.on('error', function(e) {
  console.log('problem with request: ' + e.message);
});
顺便说一句,你的返回语句不会做任何事情,也可以省略它们

此外,http.request是一个异步函数(因此,connect的返回是异步的) 您迭代i…rep并递归调用connect(),并设置超时以调用retry\u connect 总共3次,这反过来也会做同样的事情,但现在又多了3次,等等

我会告诉你你对总体反应的兴趣

function connect (opts, callback, count) {

    if (count > 3) {
        console.log('retry limit reached');
        callback({error:'retry limit reached'});
    } else {
        var request = http.request(opts, function (response) {
            var buffer = [];

            response.on('data', function (chunk) {
                buffer.push(chunk);
            });
            response.on('end', function () {
                var data = buffer.join('');
                if (response.statusCode !== 200) {
                    console.log('did not receive a 200 OK');
                    callback({error: {statusCode: response.statusCode}});
                } else {
                    //200 OK but the json data might contain an error
                    var parsed = JSON.parse(data);
                    if (parsed.error) {
                        count = (count||0) +1;
                        console.log('retrying in ' + (count * 3000));
                        setTimeout(function () {
                            console.log('retrying now');
                            connect(opts, callback, count);
                        }, 3000 * count);
                    } else {
                        console.log('200 OK and no error in json, calling callback with parsed json response');
                        callback(null, parsed);
                    }
                }
            });

        });

        request.on('error', function (error) {
            console.log('request error', error);
            callback({error:error});
        });
    }

}

connect({host: 'example.com'}, function (err, data) {
    if (err) {
        console.log('something went wrong:', err);
    } else {
        console.log('request done:', data);
    }
});

因为所有这些都是异步的,所以当事情完成/失败时,你需要某种机制来发出信号,我使用回调来实现这一点。

这很有趣。你确定不是从别的地方打过来的吗?您可以尝试使用
console.trace()
而不是
console.log('first step')
在启动新请求之前是否尝试过关闭请求?哦,是的。我试过了,但我想我用错了代码块。我是在
console.log('reconnect')
之后做的。在我关闭了闭包外部的连接之后,脚本将正确运行。谢谢你的主意!谢谢我尝试在脚本中使用回调,这种方法似乎更合适。但在启动一个新的连接之前,我必须考虑关闭连接。请告诉我为什么这个方法在POST请求上不起作用?你有一个例子吗?request.write(…)和request.end()应该可以正常工作(将它们添加到request.on('error')之后,在调用request.end之后,请求将被处理
function connect (opts, callback, count) {

    if (count > 3) {
        console.log('retry limit reached');
        callback({error:'retry limit reached'});
    } else {
        var request = http.request(opts, function (response) {
            var buffer = [];

            response.on('data', function (chunk) {
                buffer.push(chunk);
            });
            response.on('end', function () {
                var data = buffer.join('');
                if (response.statusCode !== 200) {
                    console.log('did not receive a 200 OK');
                    callback({error: {statusCode: response.statusCode}});
                } else {
                    //200 OK but the json data might contain an error
                    var parsed = JSON.parse(data);
                    if (parsed.error) {
                        count = (count||0) +1;
                        console.log('retrying in ' + (count * 3000));
                        setTimeout(function () {
                            console.log('retrying now');
                            connect(opts, callback, count);
                        }, 3000 * count);
                    } else {
                        console.log('200 OK and no error in json, calling callback with parsed json response');
                        callback(null, parsed);
                    }
                }
            });

        });

        request.on('error', function (error) {
            console.log('request error', error);
            callback({error:error});
        });
    }

}

connect({host: 'example.com'}, function (err, data) {
    if (err) {
        console.log('something went wrong:', err);
    } else {
        console.log('request done:', data);
    }
});