Node.js中Axios多次调用同一API出现ECONNRESET错误求助
批量调用API时频繁出现ECONNRESET错误
我调用某API 500次,约300次能返回正确响应,但请求过程中频繁抛出ECONNRESET错误。用C#调用同一API则完全正常,500次请求耗时约20-25秒。我已经尝试修改默认超时时间、添加http/httpsAgent的keepalive: true配置,但错误依然存在。
相关代码
axios.defaults.timeout = 20000; process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0; const getToken = async (id, username, password) => { let data = JSON.stringify({ "username": username, "password": password }); let config = { method: 'post', maxBodyLength: Infinity, url: 'URL', headers: { 'Accept': 'application/json, text/plain, */*', 'Accept-Language': 'en-GB,en-US;q=0.9,en;q=0.8', 'Authorization': '[object Object]', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Origin': 'URL', 'Referer': 'URL', 'Sec-Fetch-Dest': 'empty', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Site': 'same-site', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36', 'sec-ch-ua': '"Google Chrome";v="113", "Chromium";v="113", "Not-A.Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"' }, data : data }; try { const response = await axios.request(config); agent_tokens[id] = response.data.access_token; console.log(`${id}: Token created`); return response.data.access_token; } catch (err) { console.log(`[Token creation ${id}]: Error occured` + err); console.log(err); agent_tokens[id] = null; return null; } } const createTokens = async() => { var tokensPromise = []; for (var i = 0; i < data.length; i++) { tokensPromise.push(getToken(data[i].id, data[i].username, data[i].password)); } await Promise.all(tokensPromise).then(values => { console.log(`Promise completed`); }) return; }
请求过程中频繁抛出ECONNRESET错误。
解决方案
1. 限制并发请求数
Node.js HTTP模块默认连接池最大并发数为5,一次性发起500个请求会导致连接过载,触发服务器主动重置连接。C#默认连接数限制更高,因此能正常处理。
使用p-limit库控制并发数:
npm install p-limit
修改代码:
const pLimit = require('p-limit'); const limit = pLimit(10); // 可根据API承受能力调整并发数 const createTokens = async() => { const tokensPromise = data.map(item => limit(() => getToken(item.id, item.username, item.password)) ); await Promise.all(tokensPromise); console.log(`Promise completed`); }
2. 修复错误的请求头
代码中Authorization: '[object Object]'是无效值,会导致服务器无法识别授权信息,可能触发连接重置。若不需要该头则直接删除,需要的话替换为正确格式(如Bearer <token>)。
3. 全局复用带KeepAlive的Agent
确保所有请求复用同一个Agent,避免重复创建连接,同时配置合理的连接参数:
const https = require('https'); // 创建全局复用的Agent const httpsAgent = new https.Agent({ keepAlive: true, maxSockets: 20, // 匹配并发限制数 rejectUnauthorized: false // 替代环境变量的证书禁用配置 }); // 全局绑定Agent axios.defaults.httpsAgent = httpsAgent;
4. 添加错误重试机制
针对ECONNRESET这类临时网络错误,添加自动重试逻辑:
const getToken = async (id, username, password, retryCount = 3) => { // ... 原有config代码 ... try { const response = await axios.request(config); agent_tokens[id] = response.data.access_token; console.log(`${id}: Token created`); return response.data.access_token; } catch (err) { if (err.code === 'ECONNRESET' && retryCount > 0) { console.log(`[Token creation ${id}]: ECONNRESET,剩余重试次数${retryCount-1}`); return getToken(id, username, password, retryCount-1); } console.log(`[Token creation ${id}]: 最终错误` + err); agent_tokens[id] = null; return null; } }
内容的提问来源于stack exchange,提问作者Tanzeel Ahmed
相关产品推荐
相关产品推荐

