使用 JavaScript 获取开放天气预报

Fetching Openweather forecast using JavaScript

我想获取 JavaScript 的 5 天天气预报。当我执行下面的代码时,我得到 TypeError: Cannot read property 'temp' of undefined。如果我将 https://api.openweathermap.org/data/2.5/forecast?q= 更改为 https://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,"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}}

所以你有

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。

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

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}`)
}