正在从 node.js 向 apache2.2.21 发送请求
Sending request from node.js to apache2.2.21
每次向节点服务器发出请求时,我都会多次调用函数 dorequest。
我在 apache2.2.21 上请求网页 运行 时遇到问题。这些请求中几乎没有任何问题,但有几个请求以错误 ECONNRESET
结尾,我不知道为什么。如果我使用 apapche2.4 那么一切顺利。
var request = require('request');
function dorequest(set, callback){
request.get(url, function optionalCallback(err, httpResponse, body){
if (err){
console.log(url);
throw err;
} else {
//do some stuffs
}
});
}
可能您的 Apache 服务器只是丢弃了您的请求,因为 dorequest
函数同时发起的连接太多。
您可以通过在前一个请求的回调中调用下一个请求,在另一个回调中调用一个请求,从而执行这些请求,但是由于它们很多,并且出于美学原因,我建议使用async
library - 它很棒,在处理类似的事情时非常方便。
function dorequest(set, callback){
request.get(url, function optionalCallback(err, httpResponse, body){
if (err){
callback(err);
} else {
//do some stuffs
}
callback(err, res);
});
}
var maxRequestAtATime = 30;
async.mapLimit(arrayOfOptions, maxRequestAtATime, dorequest, function(err, results){
// results is now an array of stats for each request
});
如果一个请求的选项依赖于前一个请求的选项,你应该使用async.waterfall
。
我更新了脚本并为此使用了 async.queue 函数,但在 apache 上仍然有一些错误。
function dorequest(set, callback)
{
console.log('add request');
q.push({set: set, callback: callback}, function (err) { });
}
var q = async.queue(function (task, callback) {
setTimeout(function () {
console.log('hello ' + task.set.url, ' lenght: ',q.length());
if (task.set.method=='get')
{
myrequest.get(task.set.url, function optionalCallback(err, httpResponse, body)
{
if (err)
{
console.log(task.set.url);
throw err;
}
else
{
//console.log(set.url,body);
if (typeof task.callback !='undefined') task.callback(body);
callback();
}
});
}
else
{
if (!task.set.data) task.set.data={};
myrequest.post(task.set.url, function optionalCallback(err, httpResponse, body)
{
if (err)
{
console.log(task.set.url);
throw err;
}
else
{
//console.log(set.url,body);
if (typeof task.callback !='undefined') task.callback(body);
callback();
}
}).form(task.set.data);
}
},500);
},1);
每次向节点服务器发出请求时,我都会多次调用函数 dorequest。
我在 apache2.2.21 上请求网页 运行 时遇到问题。这些请求中几乎没有任何问题,但有几个请求以错误 ECONNRESET
结尾,我不知道为什么。如果我使用 apapche2.4 那么一切顺利。
var request = require('request');
function dorequest(set, callback){
request.get(url, function optionalCallback(err, httpResponse, body){
if (err){
console.log(url);
throw err;
} else {
//do some stuffs
}
});
}
可能您的 Apache 服务器只是丢弃了您的请求,因为 dorequest
函数同时发起的连接太多。
您可以通过在前一个请求的回调中调用下一个请求,在另一个回调中调用一个请求,从而执行这些请求,但是由于它们很多,并且出于美学原因,我建议使用async
library - 它很棒,在处理类似的事情时非常方便。
function dorequest(set, callback){
request.get(url, function optionalCallback(err, httpResponse, body){
if (err){
callback(err);
} else {
//do some stuffs
}
callback(err, res);
});
}
var maxRequestAtATime = 30;
async.mapLimit(arrayOfOptions, maxRequestAtATime, dorequest, function(err, results){
// results is now an array of stats for each request
});
如果一个请求的选项依赖于前一个请求的选项,你应该使用async.waterfall
。
我更新了脚本并为此使用了 async.queue 函数,但在 apache 上仍然有一些错误。
function dorequest(set, callback)
{
console.log('add request');
q.push({set: set, callback: callback}, function (err) { });
}
var q = async.queue(function (task, callback) {
setTimeout(function () {
console.log('hello ' + task.set.url, ' lenght: ',q.length());
if (task.set.method=='get')
{
myrequest.get(task.set.url, function optionalCallback(err, httpResponse, body)
{
if (err)
{
console.log(task.set.url);
throw err;
}
else
{
//console.log(set.url,body);
if (typeof task.callback !='undefined') task.callback(body);
callback();
}
});
}
else
{
if (!task.set.data) task.set.data={};
myrequest.post(task.set.url, function optionalCallback(err, httpResponse, body)
{
if (err)
{
console.log(task.set.url);
throw err;
}
else
{
//console.log(set.url,body);
if (typeof task.callback !='undefined') task.callback(body);
callback();
}
}).form(task.set.data);
}
},500);
},1);