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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:48:21