gpt4 book ai didi

node.js - NodeJS,如何强制异步 for 循环在传递到下一次迭代之前等待 HTTP 请求解决,这样我们就不会收到 EMFILE 错误?

转载 作者:可可西里 更新时间:2023-11-01 16:31:55 26 4
gpt4 key购买 nike

我正在尝试集成到自定义 API 中,我从数据库中获取一些行,然后将每一行连接到 API。事情是当数据库返回 3000 行或更少时,API 返回正确的响应,当我 POST 超过 3000 行时,我得到以下信息:

EMFILE ERROR -> OS won't allow the opening of more sockets

我相信 API 不会允许超过 3000 个 HTTP 请求我尝试了 promise/async-await 方法来等待 HTTP 请求结束,但不幸的是,当我添加一个 sleep 函数等待 200 毫秒或更长时间时,它唯一起作用

这里是我原来的功能:

    async function send_data(rows){
let a=0;
log.info("Emails to integrate: "+rows.length);
if(rows.length){
for(const row of rows){
log.info(row.email+" --- "+row.name+" --- "+row.id);
await integrate_data(row,a);
//await sleep(50);
a++;
}
log.info("Finished integration, setting last ID");
} else {
log.info("No data to integrate");
}
}

function integrate_data(row,counter){
var options = {
"method": "POST",
"hostname": "API-URL",
"path":"PATH/EMAIL/"+row.email,
"headers": {
"Content-Type": "application/json"
}
};
var req = http.request(options, function (res) {
var chunks = [];

res.on("data", function (chunk) {
chunks.push(chunk);
});

res.on("end", function () {
var body = Buffer.concat(chunks);
log.info(body.toString());
});
});

let obj;
obj = {
key1: row.name,
key2: row.id,
key3: row.iterationNumber
}

req.write(JSON.stringify(obj));
req.end();
}

function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}

是否有等待 HTTP 事务完成然后进入下一次迭代以便函数可以打开连接、推送数据、关闭连接然后发出信号进入下一次迭代的信号?

提前致谢

最佳答案

await integrate_data(...) 并没有按照您的想法进行。您不必等到请求完成,您的代码就会执行

req.write(JSON.stringify(obj)); 
req.end();

并进入下一次迭代。

为了 await 按预期工作,integrate_data 必须返回一个 Promise,并且应该在请求完成时解析。

function integrate_data(row, counter) {
var options = {
"method": "POST",
"hostname": "API-URL",
"path": "PATH/EMAIL/" + row.email,
"headers": {
"Content-Type": "application/json"
}
};

return new Promise((resolve, reject) => {

var req = http.request(options, function(res) {
var chunks = [];

res.on('error', reject);

res.on("data", function(chunk) {
chunks.push(chunk);
});

res.on("end", function() {
var body = Buffer.concat(chunks);
log.info(body.toString());
resolve(body.toString()); // resolve promise
});
});

let obj;
obj = {
key1: row.name,
key2: row.id,
key3: row.iterationNumber
}

req.write(JSON.stringify(obj));
req.end();
});
}

关于node.js - NodeJS,如何强制异步 for 循环在传递到下一次迭代之前等待 HTTP 请求解决,这样我们就不会收到 EMFILE 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51122605/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com