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

使用Axios处理多API请求时传递经纬度的问题

问题修复:OpenWeather API请求中经纬度未初始化错误

错误原因拆解

  • 请求顺序逻辑错误:你用Promise.all并行发起地理定位和天气请求,但天气请求依赖的经纬度必须等地理请求返回后才能获取,并行执行时getWeather会先去引用还未定义的longitude和latitude,直接触发「未初始化无法访问」的错误。
  • 变量暂时性死区问题:latitude和longitude是在地理请求返回后才声明的,getWeather函数提前引用了这两个处于暂时性死区的let变量,违反了JS的变量声明规则。
  • 额外冗余操作:JSON.parse(acct.data)完全没必要,Axios会自动解析JSON响应;JSON.stringify(perm.data)把对象转成字符串后,result.current会直接报错,因为字符串不存在current属性。

修正后的代码

app.post("/weather", async(req, res) => {
  try {
    const city = req.body.city;

    // 先获取经纬度,返回结构化数据
    async function getGeolocation() {
      const geoResponse = await axios.get(GEO_URL, {
        params: {
          q: city,
          limit: 1, // 限制只返回一个匹配城市,避免多结果混乱
          appid: myAPIKey,
        },
      });
      const targetLocation = geoResponse.data[0];
      return {
        lat: targetLocation.lat,
        lon: targetLocation.lon
      };
    };

    // 天气请求接收经纬度参数,避免依赖外部未初始化变量
    async function getWeather(lat, lon) {
      return await axios.get(API_URL, {
        params: {
          lat,
          lon,
          units: 'metric',
          appid: myAPIKey,
        },
      });
    };

    // 串行执行:先拿经纬度,再请求天气数据
    const { lat, lon } = await getGeolocation();
    const weatherResponse = await getWeather(lat, lon);

    // 直接从响应对象中取日出时间
    const sunrise = weatherResponse.data.current.sunrise;

    res.render("weather.ejs", {
      sunUp: sunrise,
      lon: lon,
      lat: lat // 修正原代码中"lan"的笔误
    });

  } catch (error) {
    // 完善错误捕获,方便调试并给用户友好提示
    console.error("请求失败详情:", error.message);
    res.render("weather.ejs", { error: "获取天气失败,请重试" });
  }
});

额外注意事项

  • 确保try/catch块完整闭合,原代码缺少catch和try的闭合括号,会导致未捕获异常扩散。
  • 地理请求加上limit:1,避免返回多个匹配城市的结果,确保取到的是最相关的经纬度。
  • 检查模板渲染时的变量名,原代码中lan是lat的笔误,修正后才能正确传递纬度数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 04:52:51