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

Express接口中数组push方法无效,始终返回空数组的问题求助

问题原因

你的代码存在两个核心问题,导致返回空数组:

  1. forEach不等待异步操作:forEach会直接遍历执行所有async回调,但不会等待这些异步请求完成。主线程走到res.json(weatherInfo)时,所有fetch请求还处于pending状态,weatherInfo自然是空的。
  2. 外层try/catch捕获不到异步错误:async函数内部的错误会包装成Promise的reject,外层的try/catch无法捕获这些异步错误,导致错误处理失效。
解决方法

改用Promise.all批量处理异步请求,它会等待所有Promise完成后再返回结果,同时配合map将每个城市的请求转换成Promise对象。

修改后的代码如下:

const getWeather = async (req, res, next) => {
  const cities = req.body.cities;
  try {
    // 将每个城市的请求转为Promise,统一处理结果
    const weatherInfo = await Promise.all(cities.map(async (city) => {
      try {
        const response = await fetch(`https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=${process.env.API_KEY}`);
        if (!response.ok) {
          return { error: "No Data Found" };
        }
        const responseData = await response.json();
        return { city: responseData.main.temp - 273.15 };
      } catch (err) {
        // 单独处理单个请求的错误,不影响其他请求
        return { error: err.message || "Failed to fetch weather data" };
      }
    }));

    res.json(weatherInfo);
  } catch (err) {
    const error = err.message || "Something Went Wrong.. Please Try again!!";
    return next(error);
  }
};

exports.getWeather = getWeather;
关键改动说明
  • 将getWeather改为async函数,允许内部使用await等待Promise.all完成
  • 用cities.map替代forEach,把每个城市的请求逻辑转换成Promise存入数组
  • 通过Promise.all等待所有请求完成,直接得到填充后的weatherInfo数组
  • 在单个请求内部添加try/catch,处理单城市请求的错误,避免一个请求失败导致整个接口报错
  • 外层try/catch处理Promise.all本身的异常(比如参数格式错误等)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:15:09