Приложение React аварийно завершает работу, если API-URL недействителен

Я пытаюсь написать свое самое первое приложение React. В форме с двумя полями ввода пользователь вводит название страны и города в поля ввода и отправляет форму. Затем переменные города и страны передаются следующему компоненту, который должен отправить API-запрос в API openweatehrmap и показать результаты.

import React, { Component } from 'react';
import axios from 'axios';
import Form from './Form/Form';

class Weather extends Component {
  state = {
    country: '',
    city: '',
    currentTemp: '',
    error: undefined,
  }


  getWeather = async (e) => {
    e.preventDefault();
    const URL = 'http://api.openweathermap.org/data/2.5/weather?q='
    const API_KEY = "8b46d478a9...34a69";
    const country = e.target.elements.country.value;
    const city = e.target.elements.city.value;
    try {
      if (country && city) {
        const response = await 
axios.get(`${URL}${city},${country}&appid=${API_KEY}&units=metric`);
        const data = await response;
        console.info(data);
        this.setState({
          country: data.data.sys.country,
          city: data.data.name,
          currentTemp: data.data.main.temp,
          error: '',
        });
      } else {
        this.setState({
          country: undefined,
          city: undefined,
          currentTemp: undefined,
          error: 'Please enter a country and a city name'
        })
      }
    } catch (err) {
      this.setState({ error: err })
    }
  }


  render() {
    let showResult;
    if (this.state.error !== undefined && this.state.country && this.state.city) {
      showResult =
        <ul>
          <li>Location: {this.state.country} {this.state.city}</li>
          <li>Current Temperature: {this.state.currentTemp}° Celsius</li>
        </ul>
    }
    else {
      showResult = <div className = "error">
        {this.state.error}
      </div>
    }

    return (
      <div>
        <Form onGetWeather = {this.getWeather} />
        {showResult}
      </div>
    );
  }
}

export default Weather;

Если вы оставите одно или оба поля ввода пустыми и отправите форму, пользовательский интерфейс покажет ошибку. Если вы заполните оба поля ввода и страна и город связаны (например, Великобритания и Лондон), пользовательский интерфейс покажет температуру и некоторую другую информацию.

тем не мение, Если вы заполните оба поля ввода случайным текстом или если страна и город не связаны друг с другом, приложение вылетит, как только форма будет отправлена.

Я думаю, это потому, что сгенерированный API-URL больше недействителен. Консоль показывает следующую ошибку:

Приложение React аварийно завершает работу, если API-URL недействителен

Я потратил целый день, но я не мог найти способ исправить это. Как я могу избежать сбоя приложения. Как я могу проверить сгенерированный API-URL? Или любой другой намек или решение?

Почему вы устанавливаете значения состояния в undefined?

Tenza 13.02.2019 18:36

Я думаю, что одно из ваших значений - это объект, а не строка. Не могли бы вы сделать console.info(this.state.country , this.state.city , this.state.currentTemp) в рендере и посмотреть значения до того, как он вылетит?

FortyTwo 13.02.2019 18:38

это происходит потому, что вы используете this.setState({ error: err }). изменить его на this.setState({ error: err.response }). Поскольку err является объектом, и вы визуализируете его как showResult = <div className = "error">{this.state.error} </div>

Sahil Raj Thapa 13.02.2019 18:41

@user1941537 user1941537, если он по-прежнему выдает журнал ошибок консоли err.response и добавляет свойство сообщения/данных в err.response как состояние error

Sahil Raj Thapa 13.02.2019 18:57
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
4
270
1

Ответы 1

Спасибо, парни.

Я думаю, что мне удалось исправить это после прочтения ваших комментариев. Мне пришлось изменить часть catch на это:

catch (err) {
      if (err.response) {
        console.info(err.response.data);
        this.setState({ error: err.response.data.message });
      }
    };

Что вы думаете?

Есть ли что-нибудь еще в моем коде, что можно было бы улучшить? (наверняка их много)

Другие вопросы по теме

Похожие вопросы

Как показать компонент в React и обновить его жизненный цикл каждый раз, когда он показывается?
Нечетный красивый отступ с React
DraftJS сохраняет данные и управляет данными в блоке рендеринга
Как предотвратить изменение значения одной из переменных состояния дочерней страницы? Как сохранить начальное значение в качестве реквизита с родительской страницы? - РеактJS
Можно ли напрямую изменить состояние, если мы не хотим выполнять повторный рендеринг?
Передача одного и того же реквизита нескольким стилизованным компонентам
Состояние внутри useEffect всегда ссылается на начальное состояние с помощью React Hooks
Как добавить точку останова в систему сетки при циклическом просмотре данных в React
Опасения по поводу производительности решения, найденного с помощью хуков React
Можно ли получить начальную точку останова с помощью макета реактивной сетки?