Next.js异步API路由中如何正确合并多请求响应?
问题原因
你遇到的核心问题是**forEach无法处理异步函数的等待逻辑**:
forEach会立即遍历完所有元素,不会等待每个异步回调里的await fetch执行完成。- 当你执行
console.log(result)时,所有网络请求还处于pending状态,result自然是空数组。 - 另外代码里直接把
Response对象展开到result里也是错误的,需要先将响应解析为实际数据(比如res.json())。
正确实现方式
使用map生成请求Promise数组,再通过Promise.all等待所有请求完成,最后合并结果:
// Next.js 异步API路由内的代码 export async function GET() { const data = ['item1', 'item2', 'item3']; try { // 1. 生成所有请求的Promise数组,同时解析响应数据 const promiseArray = data.map(async (item) => { const res = await fetch(`https://websitename.com/${item}`); // 假设接口返回JSON数组,根据实际情况调整(比如res.text()) const itemData = await res.json(); return itemData; }); // 2. 等待所有请求完成,得到每个请求的结果数组 const allResults = await Promise.all(promiseArray); // 3. 合并所有结果为一个数组 const result = allResults.flat(); console.log(result); // 正确输出合并后的数组 return new Response(JSON.stringify(result), { status: 200 }); } catch (error) { console.error('请求失败:', error); return new Response(JSON.stringify({ error: '请求出错' }), { status: 500 }); } }
额外优化建议
- 如果需要允许部分请求失败、不影响整体结果,可以用
Promise.allSettled替代Promise.all,然后过滤出成功的结果:const settledResults = await Promise.allSettled(promiseArray); const result = settledResults .filter(res => res.status === 'fulfilled') .map(res => res.value) .flat(); - 如果接口返回的不是数组,而是单个对象,直接用
Array.prototype.concat(...allResults)或者allResults.flat()(flat对单个元素也适用)合并即可。
内容的提问来源于stack exchange,提问作者Prabin
相关产品推荐
相关产品推荐

