recherche

Maison  >  Questions et réponses  >  le corps du texte

Vue CLI - TypeError : impossible de lire la propriété non définie (lire '1')

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粉068174996P粉068174996244 Il y a quelques jours471

répondre à tous(1)je répondrai

  • P粉211273535

    P粉2112735352024-03-26 13:51:34

    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.

    répondre
    0
  • Annulerrépondre