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
相关产品推荐
相关产品推荐

