当前位置: 首页 > 知识库问答 >
问题:

使用JavaScript获取Openweather forecast

鲍健柏
2023-03-14

我想用JavaScript获取5天的天气预报。当我执行下面的代码时,我得到<code>类型错误:无法读取未定义tohttps://api.openweathermap.org/data/2.5/weather?q=我获得当前天气,没有错误。为什么预测在我的情况下不起作用?我遗漏了什么吗?

JavaScript(我想. then有问题(data=

var activities = document.getElementById('activitySelector');
var main = document.querySelector('#name');
var temp = document.querySelector('.temp');
var desc = document.querySelector('.desc');



activities.addEventListener('change', (e) => {
    fetch('https://api.openweathermap.org/data/2.5/forecast?q='+e.target.value+'&appid=<<<<APIKEY>>>>&cnt=5')
        .then(response => response.json())
        .then(data => {
            var tempValue = data['main']['temp'];
            var nameValue = data['name'];
            var descValue = data['weather'][0]['description'];

            main.innerHTML = nameValue;
            desc.innerHTML = "Desc - "+descValue;
            temp.innerHTML = "Temp - "+tempValue;

        })

        .catch(err => alert(err));
})

HTML:

   <select name="cities" id="activitySelector">
       <div class="options">
           <option class="option" value="warsaw">Warsaw</option>
           <option class="option" value="phoenix">Phoenix</option>
           <option class="option" value="berlin">Berlin</option>
       </div>
   </select>

   <div class="container">
       <div class="card">
           <h1 class="name" id="name"></h1>
           <p class="temp"></p>
           <p class="clouds"></p>
           <p class="desc"></p>
       </div>
   </div>

我试图获取的JSON:

{"cod":"200 "," message":0," cnt":5," list":[{"dt":1618606800," main":{"temp":279.45," feels_like":277.97," temp_min":278.72," temp_max":279.45," pressure":1031," sea_level":1031," grnd_level":1028,"湿度":56," temp_kf":0.73}


共有2个答案

邹涵畅
2023-03-14

所以你有

https://api.openweathermap.org/data/2.5/forecast?q=

在文档中,我看到

api.openweathermap.org/data/2.5/forecast/daily?q={city name}&cnt={cnt}&appid={API key}

所以我假设你在你的URL中缺少/daily。

滕令雪
2023-03-14

问题只是您取消引用所需值的方式。

data有一个属性listlist是一个对象数组,每个对象都有一个main键,该键指向具有temp键的对象。

例如,您可以抓取所有元素并记录其 main.temp 字段,如下所示:

const data = {
  "cod": "200",
  "message": 0,
  "cnt": 5,
  "list": [{
    "dt": 1618606800,
    "main": {
      "temp": 279.45,
      "feels_like": 277.97,
      "temp_min": 278.72,
      "temp_max": 279.45,
      "pressure": 1031,
      "sea_level": 1031,
      "grnd_level": 1028,
      "humidity": 56,
      "temp_kf": 0.73
    },
    "weather": [{
      "id": 802,
      "main": "Clouds",
      "description": "scattered clouds",
      "icon": "03n"
    }],
    "clouds": {
      "all": 25
    },
    "wind": {
      "speed": 2.06,
      "deg": 80,
      "gust": 6.1
    },
    "visibility": 10000,
    "pop": 0,
    "sys": {
      "pod": "n"
    },
    "dt_txt": "2021-04-16 21:00:00"
  }, {
    "dt": 1618617600,
    "main": {
      "temp": 278.63,
      "feels_like": 277.46,
      "temp_min": 276.98,
      "temp_max": 278.63,
      "pressure": 1031,
      "sea_level": 1031,
      "grnd_level": 1028,
      "humidity": 61,
      "temp_kf": 1.65
    },
    "weather": [{
      "id": 801,
      "main": "Clouds",
      "description": "few clouds",
      "icon": "02n"
    }],
    "clouds": {
      "all": 23
    },
    "wind": {
      "speed": 1.65,
      "deg": 53,
      "gust": 4.49
    },
    "visibility": 10000,
    "pop": 0,
    "sys": {
      "pod": "n"
    },
    "dt_txt": "2021-04-17 00:00:00"
  }, {
    "dt": 1618628400,
    "main": {
      "temp": 276.91,
      "feels_like": 275.48,
      "temp_min": 275.64,
      "temp_max": 276.91,
      "pressure": 1031,
      "sea_level": 1031,
      "grnd_level": 1027,
      "humidity": 66,
      "temp_kf": 1.27
    },
    "weather": [{
      "id": 800,
      "main": "Clear",
      "description": "clear sky",
      "icon": "01n"
    }],
    "clouds": {
      "all": 10
    },
    "wind": {
      "speed": 1.65,
      "deg": 21,
      "gust": 4.06
    },
    "visibility": 10000,
    "pop": 0,
    "sys": {
      "pod": "n"
    },
    "dt_txt": "2021-04-17 03:00:00"
  }, {
    "dt": 1618639200,
    "main": {
      "temp": 275.25,
      "feels_like": 273.27,
      "temp_min": 275.25,
      "temp_max": 275.25,
      "pressure": 1031,
      "sea_level": 1031,
      "grnd_level": 1028,
      "humidity": 67,
      "temp_kf": 0
    },
    "weather": [{
      "id": 800,
      "main": "Clear",
      "description": "clear sky",
      "icon": "01d"
    }],
    "clouds": {
      "all": 1
    },
    "wind": {
      "speed": 1.89,
      "deg": 16,
      "gust": 4.72
    },
    "visibility": 10000,
    "pop": 0,
    "sys": {
      "pod": "d"
    },
    "dt_txt": "2021-04-17 06:00:00"
  }, {
    "dt": 1618650000,
    "main": {
      "temp": 280.37,
      "feels_like": 278.43,
      "temp_min": 280.37,
      "temp_max": 280.37,
      "pressure": 1030,
      "sea_level": 1030,
      "grnd_level": 1027,
      "humidity": 44,
      "temp_kf": 0
    },
    "weather": [{
      "id": 800,
      "main": "Clear",
      "description": "clear sky",
      "icon": "01d"
    }],
    "clouds": {
      "all": 2
    },
    "wind": {
      "speed": 2.84,
      "deg": 39,
      "gust": 4.51
    },
    "visibility": 10000,
    "pop": 0,
    "sys": {
      "pod": "d"
    },
    "dt_txt": "2021-04-17 09:00:00"
  }],
  "city": {
    "id": 2643743,
    "name": "London",
    "coord": {
      "lat": 51.5085,
      "lon": -0.1257
    },
    "country": "GB",
    "population": 1000000,
    "timezone": 3600,
    "sunrise": 1618549331,
    "sunset": 1618599475
  }
}

for (const day of data.list){
   console.log(`Temp: ${day.main.temp}`)
}
 类似资料:
  • 问题内容: 我知道我可以通过JavaScript 设置 CSS值,例如: 但是,我可以获得当前的特定样式值吗?我已经读到了可以获取元素整个样式的地方,但是如果不需要的话,我不想解析整个字符串。 问题答案: 你可以使用getComputedStyle()。

  • 问题内容: 我想要的只是获取网站URL。不是从链接获取的URL。在页面加载过程中,我需要能够获取网站的完整,当前URL,并将其设置为一个变量,以便我随意使用。 问题答案: 使用: 如评论中所述,下面的行有效,但对于Firefox而言是错误的。

  • 问题内容: 遇到了似乎是同源政策的问题,这引起了很多麻烦! 为了追赶,我基本上是在仅提供用户名时尝试获取用户的steam64id。 例如,我的用户名:“ Emperor_Jordan”将转到: http://steamcommunity.com/id/emperor_jordan?xml=1 而我需要的小蒸汽就在顶部。所以我想我将使用JQuery Ajax来获取它并解析出我以后需要使用的id(st

  • 这是我的第一篇文章,因为我找不到任何解决我的问题的方法。(现在谷歌了几天)我不是程序员,我是一个好的谷歌人:) 我正在尝试使用用户名,密码和一些选项登录网站。(/api/login/Basic)之后,我尝试访问一个网站。(/api/sitemaster/run)但在这里,我收到消息:“用户没有足够的访问权限”如果我使用浏览器执行此操作,一切正常。 我想我需要将一些Authtoken传递给Get请求

  • 问题内容: 我有一个XML文档,其中包含具有格式正确的HTML内容的标签。我需要使用JavaScript将HTML导入页面。但是,由于CMS问题,HTML不能使用<![CDATA []]>或其他任何符号进行转义,并且<>必须存在,而不是编码为&lt;。&gt; 我使用jQuery来获取XML,并将子菜单放入数组中。我可以通过以下方式获取文字: 但是,这仅返回“ Hello World Lorem

  • 问题内容: 关于如何在不使用jQuery的情况下获得div高度的任何想法? 我正在搜索Stack Overflow这个问题,似乎每个答案都指向jQuery的。 我尝试了类似的方法,但是即使我的div具有CSS 并在CSS中进行了设置,它也没有返回任何内容。 问题答案: 要么 包括填充。 包括填充,scrollBar和边框。