Vue CLI - TypeError : impossible de lire la propriété non définie (lire '1')
P粉068174996
P粉068174996 2024-03-25 22:30:03
0
1
493

Je suis débutant en VueJS et j'aimerais votre aide.

J'essaie de créer une application de prévisions météo basée sur OpenWeatherMap API.

Le concept est le suivant :

  1. Entrez un emplacement sur la page d'accueil et appuyez sur le bouton de recherche. (Dans mon code c'est un composant Search.vue)
  2. Redirection vers une autre page et affiche les résultats - météo actuelle et prévisions météorologiques pour les 6 prochains jours. (composant Weather.vue)

J'ai créé une fonction avec deux appels de récupération cohérents. Obtenez d’abord l’entrée de input query 并从 Current Weather Data API 返回所需的数据。之后,函数运行第二次获取到 One 根据第一次获取的 latitude longitude 调用 API.

Tout fonctionne et s'affiche bien, mais je ne comprends pas pourquoi j'ai une erreur Uncaught (in Promise) TypeError: Cannot readproperties of undefined (reading '1') dans la console :

Est-ce que quelqu'un sait comment corriger cette erreur ?

Mon composant Search.vue (Maison) :

<template>
    <div class="row">
        <div class="search-col col">
            <div class="search-box">
                <input 
                    type="text" 
                    class="search-bar" 
                    placeholder="Location" 
                    v-model="query">
                <router-link :to="{name: 'DetailedWeather', params: { query: query }}" class="btn-search">
                    <i class="fas fa-search"></i>
                </router-link>
            </div>
        </div>
    </div>
</template>

Mon composant Weather.vue (page d'affichage des résultats météo) :

<template>
    <div class="row" v-if="typeof weather.main != 'undefined'">
        <div class="weather-col col">
            <div class="weather-app">
                <div class="weather-box">
                    <div class="weather-top-info">
                        <div class="clouds-level"><span class="icon"><i class="fas fa-cloud"></i></span> {{ weather.clouds.all }}%</div>
                        <div class="humidity"><span class="icon"><i class="fas fa-tint"></i></span> {{ weather.main.humidity }}%</div>
                    </div>
                    <div class="weather-main-info">
                        <div class="temp-box">
                            <div class="temp-main">{{ Math.round(weather.main.temp) }}</div>
                            <div class="temp-inner-box">
                                <div class="temp-sign">°C</div>
                                <div class="temp-max"><span class="icon"><i class="fas fa-long-arrow-alt-up"></i></span> {{ Math.round(weather.main.temp_max) }}°</div>
                                <div class="temp-min"><span class="icon"><i class="fas fa-long-arrow-alt-down"></i></span> {{ Math.round(weather.main.temp_min) }}°</div>
                            </div>
                        </div>
                        <div class="weather-desc">{{ weather.weather[0].description }}</div>
                        <div class="weather-icon">
                            <img :src="'http://openweathermap.org/img/wn/'+ weather.weather[0].icon +'@4x.png'">  
                        </div>
                    </div>
                    <div class="weather-extra-info">
                        <div>Feels like: <span>{{ Math.round(weather.main.feels_like) }}°C</span></div>
                        <div>Sunrise: <span>{{ weather.sys.sunrise }}</span></div>
                        <div>Sunset: <span>{{ weather.sys.sunset }}</span></div>
                    </div>
                </div>
            </div>
        </div>
        <div class="forecast-col col">
            <div class="row">
                <div class="forecast-item-col col"  v-for="day in forecastDays" :key="day">
                    <div class="forecast-box">
                        <div class="forecast-date">{{ forecast.daily[day].dt }}</div>
                        <div class="forecast-temp">{{ Math.round(forecast.daily[day].temp.day) }}°C</div>
                        <div class="forecast-icon"><img :src="'http://openweathermap.org/img/wn/'+ forecast.daily[day].weather[0].icon +'@2x.png'"></div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="row">
        <div class="actions-col col">
            <router-link :to="{name: 'Search'}" class="btn btn-default">
                Back to search
            </router-link>
        </div>
    </div>
</template>
<script>
    export default {
        name: 'Weather',
        props: ['query'], //getting from homepage
        data() {
            return {
                api_key:'b7fe640e9a244244a6f806f3a6cbf5fc',
                url_base:'https://api.openweathermap.org/data/2.5/',
                forecastDays: 6,
                weather: {},
                forecast: {}
                
            }
        },
    methods: {
        fetchWeather(){
            // first call
            fetch(`${this.url_base}weather?q=${this.query}&units=metric&appid=${this.api_key}`)
            .then(response =>{ return response.json() }).then(this.setResults);
        },
        setResults(results){
          this.weather = results;

          // consistent second call
          fetch(`${this.url_base}onecall?lat=${results.coord.lat}&lon=${results.coord.lon}&exclude=current,minutely,hourly,alerts&units=metric&appid=${this.api_key}`)
          .then(data =>{ return data.json() }).then(this.setForecast);
        },
    
        setForecast(results){
            this.forecast = results
        },
    },
    created() {
        this.fetchWeather();
    }
</script>

Mon router/index.js Dossier :

import { createRouter, createWebHashHistory } from 'vue-router'
import Search from '../components/Search.vue'
import Weather from '../components/Weather.vue'

const routes = [
  {
    path: '/',
    name: 'Search',
    component: Search
  },
  {
    path: '/detailed-weather',
    name: 'DetailedWeather',
    component: Weather,
    props: true
  }
]

const router = createRouter({
  history: createWebHashHistory(),
  routes
})

export default router

P粉068174996
P粉068174996

répondre à tous(1)
P粉211273535

D'après mon hypothèse (compte tenu du code et de l'erreur), il pourrait y avoir un problème avec l'objet que vous recevez de l'API.

Le message d'erreur indique que vous essayez de lire quelque chose à partir d'un index spécifique du tableau qui n'est pas défini.

La seule situation dans votre code qui pourrait provoquer cette erreur provient du modèle que vous lisez, par exemple :

{{ forecast.daily[day].dt }}
{{ Math.round(forecast.daily[day].temp.day) }}

Je ne peux pas dire exactement de quoi il s'agit, mais essayez de revérifier la forme de l'objet avec lequel vous travaillez.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal