一些背景:
我所做的是从客户端收到带有一些ID的CSV文件。
我在文件上运行,对于每个ID,我需要进行一个休息查询,然后是另一个休息查询。
当我执行1000到~5,000个ids时,这个工作正常但在此之后,我在日志中的大多数响应都是错误而不是" 200"。
错误是:
[Error: connect ENOBUFS XX.XX.XX.XXX:8080 - Local (undefined:undefined)]
code: 'ENOBUFS',
errno: 'ENOBUFS',
syscall: 'connect',
address: 'XX.XX.XX.XXX',
port: 8080
我在类似问题上看到的建议是使用async.eachOfLimit
这种方式来提出少量请求,但对于某些人来说,在第一次迭代后它不会继续。
http://caolan.github.io/async/docs.html#eachOfLimit - 文档是否为模块。
简单的代码说明:
router.post('/upload', function(req, res, next) {
.
.
.
async.eachOfLimit(ids,100, CheckAndUpdate);
});
function CheckAndUpdate(DirtyId, callback){
request({
uri: "http://XX.XX.XX.XXX:8080/rest/getTureIDs" + DirtyId, ",
json: true
}, function(err, res, data) {
if (err) {
console.log('Error:', err);
} else if (res.statusCode !== 200) {
console.log('Status:', res.statusCode);
} else {
if (data["TrueIDs"].length > 0){
for (var index in data["TrueIDs"]){
var fetchedID = data["TrueIDs"][index]["id"];
UpdateSomethingForID(fetchedID);
}
}
}
});
}
function UpdateSomethingForID(ID, callback){
request({
uri: "http://XX.XX.XX.XXX:8080/rest/SetTouchedToday/" + ID,
json: true
}, function(err, res, data) {
if (err) {
console.log('Error:', err);
} else if (res.statusCode !== 200) {
console.log('Status:', res.statusCode);
} else {
console.log("Great success");
}
});
}
所以问题是:
我怎么能"垃圾邮件"请求以更合适的方式避免ENOBUFS?
或者我对eachOfLimit
的错误是什么?
提前致谢!