Node.js中https请求内更新对象外部不生效问题及代码修正需求
问题原因
https.get 是异步操作,你的代码在所有请求还未完成、还没往result里填充数据时,就执行了res.json(result),所以前端拿到的是空对象。另外,原代码只监听了data事件,没考虑响应数据可能分段返回的情况,直接解析单次data可能导致JSON解析错误。
修正后的代码
app.post("/getWeather", async (req, res, next) => { console.log(req.body.cities); const cities = req.body.cities; const result = {}; // 封装单个城市的天气请求为Promise const fetchWeather = (city) => { return new Promise((resolve) => { // 注意:替换url中的城市占位符(比如把{city}换成实际城市名),匹配你的API格式 const cityUrl = url.replace('{city}', city); https.get(cityUrl, (response) => { let rawData = ''; // 拼接分段返回的响应数据 response.on("data", (chunk) => { rawData += chunk; }); // 响应结束后解析完整数据 response.on("end", () => { try { const wdata = JSON.parse(rawData); const temperature = wdata.main.temp; resolve({ city, temp: temperature }); } catch (err) { console.error('数据解析失败:', err); resolve({ city, temp: "NA" }); } }); }).on("error", (err) => { console.log('请求失败:', err); resolve({ city, temp: "NA" }); }); }); }; // 并行发起所有请求,等待全部完成后整理结果 try { const weatherResults = await Promise.all(cities.map(city => fetchWeather(city))); weatherResults.forEach(item => { result[item.city] = item.temp; }); return res.json(result); } catch (err) { console.error('整体请求处理失败:', err); return res.status(500).json({ error: '获取天气数据失败' }); } });
关键修改点
- 用
async/await+Promise.all处理异步请求,确保所有请求完成后再返回结果 - 封装每个城市的请求为Promise,统一处理成功、失败、解析错误的情况
- 监听
response的end事件,拼接所有分段数据后再解析JSON,避免因数据不完整导致的解析错误 - 增加异常捕获逻辑,返回更友好的错误响应
内容的提问来源于stack exchange,提问作者ARGHYA DEEP PAL
相关产品推荐
相关产品推荐

