因此,我们即将将大量内容从一个站点移动到另一个站点,并且所有内容都将具有不同的路径。 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);
});
答案 0 :(得分:1)
将agent
属性设置为false
以强制Connection: close
(我建议仅针对您的具体情况,但不作为默认的首选项):http://nodejs.org/api/http.html#http_http_request_options_callback
奖励信息:仅通过间隔将请求数量限制为5 /秒是不够的。在开始下一个调用之前,您需要等待http.get
次回拨。如果需要超过1秒的时间来捕获响应并关闭连接,则您的请求率将超过每秒5次。我建议类似于异步的并行限制控制流程:https://github.com/caolan/async#parallellimittasks-limit-callback