Node.js中间件如何分组API调用?批量处理ID解决414错误
解决URI过长的批量处理方案
要解决414请求URI过长的问题,核心思路是把大量任务ID拆分成固定大小的批次,每个批次单独调用API。具体实现步骤如下:
1. 实现数组分组工具函数
先写一个通用函数,把大数组拆分成指定大小的子数组,这里默认每50个ID为一组:
function chunkArray(arr, chunkSize) { const chunks = []; for (let i = 0; i < arr.length; i += chunkSize) { chunks.push(arr.slice(i, i + chunkSize)); } return chunks; }
2. 改造API调用逻辑
新增批量处理函数,先把ID列表转成数组(如果传入的是逗号分隔字符串的话),再拆分批次,逐个调用API:
串行调用(推荐,避免并发过高触发服务器限制)
const axios = require('axios'); const patchProducts = async (ids) => { try { await axios.patch(`api/${ids}`); } catch (error) { console.log(error); } }; const batchPatchProducts = async (allIds, batchSize = 50) => { // 如果传入的是逗号分隔字符串,先转成数组并去除空格 const idArray = typeof allIds === 'string' ? allIds.split(',').map(id => id.trim()) : allIds; // 拆分成指定大小的批次 const idBatches = chunkArray(idArray, batchSize); // 逐个批次调用API for (const batch of idBatches) { const idsStr = batch.join(','); console.log(`正在处理批次:${idsStr}`); await patchProducts(idsStr); } };
并行调用(适合无并发限制的场景,效率更高)
如果服务器允许高并发,可以用Promise.all同时处理多个批次:
const batchPatchProducts = async (allIds, batchSize = 50) => { const idArray = typeof allIds === 'string' ? allIds.split(',').map(id => id.trim()) : allIds; const idBatches = chunkArray(idArray, batchSize); // 并行处理所有批次 await Promise.all(idBatches.map(async (batch) => { const idsStr = batch.join(','); console.log(`正在处理批次:${idsStr}`); await patchProducts(idsStr); })); };
3. 使用示例
// 假设有120个任务ID const allTaskIds = Array.from({length: 120}, (_, i) => i + 1); // 或者传入逗号分隔字符串 // const allTaskIds = "1, 2, 3, ..., 120"; // 调用批量处理函数 batchPatchProducts(allTaskIds, 50);
这样每个请求的URI只会包含最多50个ID,从根本上避免了414错误。如果需要调整批次大小,可以修改batchSize参数,灵活适配服务器对URI长度的限制。
内容的提问来源于stack exchange,提问作者Whiz
相关产品推荐
相关产品推荐

