节点:即使服务器发送保持活动状态,也要关闭http.get响应

时间:2014-07-10 21:52:18

标签: node.js http

因此,我们即将将大量内容从一个站点移动到另一个站点,并且所有内容都将具有不同的路径。 Web服务器将使用301重定向来确保具有现有书签的人员访问新资源。我被要求编写一个脚本,测试所有重定向是否已正确设置。

预期的重定向将位于具有以下格式的文本文件中:

/path/to/resource/1 http://www.newsite.com/new/path/to/resource1    
/path/to/resource/2 http://www.newsite.com/new/path/to/resource2

这将是一个非常大的文件,因此我编写了一个节点脚本,使用line-reader将每行拉出文件,并将其传递给执行实际检查的函数。

对于最多五行的文件,它可以正常工作。如果文件有超过5个条目,它仍然循环遍历整个文件,并且每次调用check函数(我使用console.log来确认这一点)但只返回前五个 - 下面的代码列出了“为文件中的每一行调用check301 for ...“,但只有前五个命中了”Getting ...“日志语句。我试过增加超时。我检查http get调用上的错误。我添加了代码试图捕获任何未处理的异常。纳达。

我错过了什么?

编辑:显然我缺少的是http默认为一次可用的五个套接字(http://nodejs.org/api/http.html#http_agent_maxsockets)并且我的服务器正在发送保持活动。有没有办法强制连接忽略keep-alive头,或者在我完成处理响应后销毁连接?

/* Check a provided list of URL pairs for redirection.
 * redirects.txt should have one line per redirect, with the url to
 * be requested and the URL to be redirected to seperated by a space.
 */
var urlBase = "http://www.example.com",
    testPair = [],
    http = require('http'),
    lineReader = require('line-reader');

function check301(source, destination){
  console.log('Calling check301 for ' + source);
  var target = urlBase + source;
  http.get(target, function(response){
    console.log('Getting ' + source);
    if (response.statusCode != 301 ||
        response.headers.location != destination){
      console.log(source + ' does not redirect to ' + destination);
    }
  }).on('error', function(e){
    console.log(e.message);
  });
}

//Throttled version.  No more than 5 reqs a second to keep the server happy.
lineReader.open('redirects.txt', function(reader){
  var interval = setInterval(function(){
    if(reader.hasNextLine()){
      reader.nextLine(function(line){
        testPair = line.split(' ');
        check301(testPair[0], testPair[1]);
      });
    } else {
      clearInterval(interval);
      console.log('Done');
    }
  }, 200);
});

1 个答案:

答案 0 :(得分:1)

agent属性设置为false以强制Connection: close(我建议仅针对您的具体情况,但不作为默认的首选项):http://nodejs.org/api/http.html#http_http_request_options_callback

IIRC,不使用Node.js HTTP's underlying default Agent也将减轻汇集问题"你正在观察。

奖励信息:仅通过间隔将请求数量限制为5 /秒是不够的。在开始下一个调用之前,您需要等待http.get次回拨。如果需要超过1秒的时间来捕获响应并关闭连接,则您的请求率将超过每秒5次。我建议类似于异步的并行限制控制流程:https://github.com/caolan/async#parallellimittasks-limit-callback