使用OpenWeather API获取UV Index报错:response.city.coord is not a function
排查并修复UV Index获取的代码问题
首先咱们先揪出导致response.city.coord is not a function错误的核心原因:
- 你错误地把字符串
"response.city.coord"当成函数来调用了,这完全不符合JS访问对象属性的语法。正确的方式是直接从forecast接口返回的response对象里读取属性,而不是用字符串包裹后加括号。 - 另外,你的UV请求必须放在forecast请求的回调函数里,确保拿到经纬度后再发起请求,不然可能会因为异步顺序问题导致拿不到数据。
- 还有个小细节:模板字符串里的
&要换成&,因为模板字符串不需要HTML转义。
修正后的完整代码示例
假设你已经有了forecast接口的请求,把UV的请求嵌套进去就能保证时序正确:
// 先发起forecast接口请求获取目标城市经纬度 var apiKeyForecast = "你的forecast接口API密钥"; var forecastQueryURL = `https://api.openweathermap.org/data/2.5/forecast?appid=${apiKeyForecast}&q=目标城市`; $.ajax({ url: forecastQueryURL, method: "GET" }).then(function(forecastResponse) { // 正确读取经纬度:直接访问对象属性,而非错误的字符串调用 var lat = forecastResponse.city.coord.lat; var lon = forecastResponse.city.coord.lon; var apiKey1 = "ada1f715672a438e9b9acaa7ea0e930b"; // 修正URL里的&符号,模板字符串无需HTML转义 var queryURL2 = `https://api.openweathermap.org/data/2.5/uvi?appid=${apiKey1}&lat=${lat}&lon=${lon}`; // 发起UV指数请求 $.ajax({ url: queryURL2, method: "GET", }).then(function(res) { var uvI = res.value; $(".uvIndex").text("UV Index: " + uvI); }).catch(function(err) { // 添加错误捕获,方便调试问题 console.error("获取UV指数失败:", err); $(".uvIndex").text("UV Index: 获取失败"); }); }).catch(function(err) { console.error("获取forecast数据失败:", err); });
关键修正点说明
- 经纬度读取语法:用
forecastResponse.city.coord.lat和forecastResponse.city.coord.lon直接访问对象嵌套属性,替换掉错误的字符串函数调用写法。 - 异步请求顺序:将UV请求嵌套在forecast请求的
then回调内,保证只有拿到经纬度后才发起UV请求,避免异步时序问题。 - URL格式修正:模板字符串中直接使用
&而非&,因为HTML转义字符在JS代码里不需要。 - 错误处理增强:添加
catch回调捕获请求失败的情况,方便调试同时提升页面体验。
这样修改后,就能正确获取UV指数并显示在页面上了。
内容的提问来源于stack exchange,提问作者Félix




