节点http.request HEAD问题

时间:2015-03-27 10:31:25

标签: node.js asynchronous

使用方法' HEAD'。

制作大量请求时出现问题

我已将async.queue设置为20,并将超时设置为3000毫秒。 无论如何,当我跑: 我看到10-15的成功,比一些更成功的时间,一个挂起...没有进一步发生。

如果我删除超时我有大约10个成功并挂起... 我也没有得到错误信息。

请求代码:

function getHeader(link)
{  
  var correctUrl = url.parse(link);  
  var options = {method: 'HEAD', host: correctUrl.hostname, port: 80, path: correctUrl.pathname};  
  var req = http.request(options, function(res) {   
    if(res.statusCode == 404 || res.statusCode == 500) return;      
    var x = {
      loc : link     
    };  

    if(typeof(res.headers['last-modified']) != "undefined") 
    {
      x.lastmod = dateConverter(res.headers['last-modified']);      
      console.log("Added lastmodify: " + x.lastmod);
    }
    console.log(res.headers);    
    parser.allObjects.push(x);    
  });  

  req.setTimeout(3000, function() {
    console.log("Timeout reached. Link:" + link);
    req.abort();
  });

  req.on('error', function (e) {
    console.log('problem with request: ' + e.message);
  });

  req.end();
}

队列在这里:

var queue = async.queue(function (href, callback) {
  getHeader(href,function(err){
    if(err) return callback(err);
    return callback();
  });
}, parser.serverMight); // this set to 20 at the mom (decreased from 50)

queue.drain = function() {
  formXml(null, parser.allObjects);
};

queue.push(toRequest, function(err) {
  if(err) console.log(err);
});

非常感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

嘿,发现自己。也许这可能对某人有帮助。 所以错误很简单: 我没有从getHeader函数回调,我只是使用了return。这就是为什么队列无法开始下一轮的原因。 Httpreq占用的空间更少,所以我会留下它。

以下是正确代码的外观:

function getHeader(link, callback)
{   
  httpreq.get(link, function(err, res) {      
    if(err) return callback(err);
    if(res.statusCode == 404 || res.statusCode == 500)
    {
      parser.allHrefs.remove(parser.allHrefs.indexOf(link));
      console.log("Faced status code 404 || 500. url deleted: " + link);
      return callback(null);
    }
    //collect header-info
    var x = { loc : link };
    if(typeof(res.headers['last-modified']) != "undefined")     
      x.lastmod = dateConverter(res.headers['last-modified']);      

    console.log("Success adding header:" + x.loc);
    parser.allObjects.push(x);
    return callback(null);
  });   
}

p.s。:为什么'httpreq'(请求完整的请求正文)比'http'(请求HEAD)更快...