Express接口中数组push方法无效,始终返回空数组的问题求助
问题原因
你的代码存在两个核心问题,导致返回空数组:
- forEach不等待异步操作:
forEach会直接遍历执行所有async回调,但不会等待这些异步请求完成。主线程走到res.json(weatherInfo)时,所有fetch请求还处于pending状态,weatherInfo自然是空的。 - 外层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
相关产品推荐
相关产品推荐

