节点http.get未触发

时间:2013-07-03 20:40:49

标签: node.js httprequest

我试图有一个带有http.get请求的循环 - 我不知道为什么函数没有启动。 我的代码是:

while(List.length>0) {                
   if(counter < Limit) { // Limit is the amount of requests I want to 
        counter++;
        inProcess++;
        var scanitem =  List.pop();

      var body = "";    
      var url = 'https://www.mywebsite.com/'+scanitem;
      var options = {
                      path: url,                                                
                      method: 'GET'
                    };
      console.log(url); // This part is happenning
      var _request =  https.get(options, function (res) {
                       console.log('get web site');// this part is NOT showup. 
                       res.on('data', function (chunk) {
                          console.log(chunk); // this part is NOT showup. 
                          body += chunk.toString();            
                      });
                      res.on("end", function() {                            
                        console.log(body);// this part is NOT showup. 
                      });
                      res.on("error", function(error) {                         
                       console.log('error')// this part is NOT showup. 
                      });
                  });
       _request.end();         
   }                                        
   else {
      console.log('list BREAK');} // This part is happenning after the limit crossed

1 个答案:

答案 0 :(得分:0)

  1. 当传递Object作为第一个参数时,URL应分解为单个部分:

    var options = {
        method: 'GET',
        protocol: 'https:',
        hostname: 'www.mywebsite.com',
        path: '/' + scanitem
    };
    
    var _request = https.get(options, ...);
    

    options涵盖了所使用的https.get()Stringhttps.get()的便利变体。

    您也可以传递网址var _request = https.get(url, ...); var body = "";将为您运行https.request()

    while
  2. JavaScript没有块范围的变量(url.parse())。因此,尽管位置为body,但scanitem循环的每次迭代仍然会附加到同一url

    当变量仅由optionshttps.get()function等同步任务使用时,这并不是一个问题。但是,当混合使用List这样的异步任务时,你不可能得到你期望的结果。

    在目前没有块范围变量的情况下,您可以使用yet创建额外的Array范围。

    由于function似乎是List.forEach(function (scanitem) { var body = ''; var url = 'https://www.mywebsite.com/'+scanitem; https.get(url, function (res) { // etc. }); }); ,您可以使用带closure的迭代器Limit

    .splice()

    而且,对于Array,您可以使用List.splice(0, Limit).forEach(function (scanitem) { // etc. }); 删除并使用您想要的https.request()部分:

    _request.end()

  3. 此外,与https.get()不同,使用{{1}}时,您无需致电{{1}}。