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

Node.js中发起过多请求是否会引发错误?附代码及异常现象

Node.js批量请求出现无序结果与socket hang out错误的原因及解决方法

是的,你遇到的问题确实和一次性发起过多并发请求直接相关,咱们来一步步拆解原因和解决办法:

为什么会出现这些问题?

1. 无序的结果

你用forEach循环直接发起所有请求,而request是异步操作——这意味着所有请求会被同时触发,但响应返回的顺序完全取决于每个请求的网络耗时、服务器处理速度,所以输出的结果自然是无序的。

2. socket hang out错误

这个错误通常有两个核心原因:

  • 本地资源限制:Node.js底层依赖操作系统的文件描述符来管理网络连接,一次性发起50个请求会瞬间占用大量连接资源,当超过系统或Node.js默认的连接限制时,就会出现连接被中断的情况。
  • 目标服务器限流:大多数服务器都会对来自同一IP的并发请求数做限制,当你短时间内发起大量请求时,服务器可能会直接断开部分连接,以此来保护自身服务稳定,这就会触发socket hang out错误。

怎么解决这些问题?

方法1:限制并发请求数量

最稳妥的方式是控制同时发起的请求数,避免一次性压垮本地或目标服务器。你可以使用async库的mapLimit方法(需先安装:npm install async):

const async = require('async');
const request = require('request');

// 注意:把原代码的对象改成数组存储URL,遍历更可靠
const urlArr = ['https://www.google.com', /* 其他URL... */];

// 限制同时最多5个请求
async.mapLimit(urlArr, 5, function(url, callback) {
  request(url, function(err, res, body) {
    const index = urlArr.indexOf(url);
    if (err) {
      console.log(`${index} error: ${err.message}`);
      callback(err);
    } else {
      console.log(`${index} success`);
      callback(null, body);
    }
  });
}, function(err, results) {
  // 所有请求完成后的回调
  if (err) console.log("部分请求失败");
  else console.log("所有请求完成");
});

方法2:改用Promise+async/await实现分批请求

如果你更倾向于原生Promise语法,可以自己实现分批处理逻辑:

const request = require('request-promise'); // 需安装:npm install request-promise
const urlArr = ['https://www.google.com', /* 其他URL... */];

// 分批处理函数
async function batchRequest(urls, batchSize) {
  const results = [];
  for (let i = 0; i < urls.length; i += batchSize) {
    const batch = urls.slice(i, i + batchSize);
    // 等待当前批次的所有请求完成
    const batchResults = await Promise.all(
      batch.map(async (url, batchIndex) => {
        const globalIndex = i + batchIndex;
        try {
          await request(url);
          console.log(`${globalIndex} success`);
          return { success: true, url };
        } catch (err) {
          console.log(`${globalIndex} error: ${err.message}`);
          return { success: false, url, error: err.message };
        }
      })
    );
    results.push(...batchResults);
  }
  return results;
}

// 调用,每次处理5个请求
batchRequest(urlArr, 5).then(() => console.log("所有请求处理完成"));

额外小提示

原代码里的urlArr是对象类型,但forEach是数组的专属方法(除非用了第三方工具库),建议改成数组类型存储URL列表,这样遍历逻辑更可靠。

内容的提问来源于stack exchange,提问作者Jinsu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:37:36