You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 19:45:27