Почему у меня возникают ошибки в React при загрузке данных из базы данных Postgresql?

У меня есть база данных с 2 таблицами Человек и Город с отношением Один ко многим

Пример строки в Person:

{id: 1, name: 'John', city: 5}

Пример строки в Городе:

{id: 5, name: 'New York'}

В приложении React я получаю значения из базы данных Postgresql, сохраняю их в состоянии и показываю в компоненте (таблице):

...
render() {
 return (
  <table>
    <thead>
      <TableHeader/>
    </thead>
    <tbody>
      {this.props.person.map(item => {
        const city = this.props.city.find(el => el.id === item.city);

        return (<TableRow key = {item.id} directory = {item} directoryC = {city}/>);
      })}
    </tbody>
  </table>
);

В TableRow я добавляю его в строки таблицы:

...
render() {
 return (
   <tr>        
     <td>{this.props.directory.name}</td>
     <td>{this.props.directoryC.name}</td>        
   </tr>
 );
}

Этот код работает, но в консоли я вижу это ошибка:

Uncaught (in promise) TypeError: Cannot read property 'name' of undefined

Что случилось? Как исправить эту ошибку?

Обновлять. Получить код:

onHandlePersonFetch() {
fetch(`${'127.0.0.1:3000'}/person`, {
  method: 'GET'
})
  .then((response) => {
    if (response.status >= 400) {
      throw new Error('Bad response from server');
    }
    return response.json();
  })
  .then(data =>
    this.setState({ person: data })
  );
  }

  onHandleCityFetch() {
fetch(`${'127.0.0.1:3000'}/city`, {
  method: 'GET'
})
  .then((response) => {
    if (response.status >= 400) {
      throw new Error('Bad response from server');
    }
    return response.json();
  })
  .then(data =>
    this.setState({ city: data })
  );
  }

Он сообщает вам, что произошла ошибка, но вы ее не уловили ... Опубликуйте код получения

SakoBu 20.10.2018 23:33

Похоже, код работает должным образом. Однако ошибка, похоже, возникает, когда вы извлекаете данные из базы данных (возможно, с использованием метода fetch, который объяснил бы TypeError обещания). Проверьте консоль, чтобы выяснить, какой файл выбрасывает undefined. Это должно дать вам лучшее представление о происхождении проблемы.

Juan Marco 20.10.2018 23:39

@SakoBu добавить в сообщение

Jack 21.10.2018 09:46

@JuanMarco я добавил, чтобы опубликовать свой код получения. Проверьте пожалуйста, может проблема в этом

Jack 21.10.2018 10:00

@ Джек Ну вот ...

SakoBu 21.10.2018 11:56

Приведенный ниже код должен помочь вам продвинуться вперед, но мне также интересно, как выглядит ваше состояние по умолчанию в конструкторе ...

SakoBu 21.10.2018 12:36

@SakoBu в состоянии по умолчанию у меня нет ... ничего. this.state = {город: [], человек: []}

Jack 21.10.2018 15:20
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
7
240
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это неправильный способ обработки ошибок в обещаниях ... Измените на это:

 onHandlePersonFetch() {
    fetch(`${'127.0.0.1:3000'}/person`)
      .then(response => response.json())
      .then(data => this.setState({ person: data }))
      .catch(err => console.info(err));
  }

  onHandleCityFetch() {
    fetch(`${'127.0.0.1:3000'}/city`)
      .then(response => response.json())
      .then(data => this.setState({ city: data }))
      .catch(err => console.info(err));
  }

Кроме того, если вы выполняете асинхронную выборку данных (что вы ...), это должно выполняться в рамках метода жизненного цикла componentDidMount ...

Я вызываю onHandlePersonFetch () и onHandleCityFetch () в ComponentDidMount

Jack 21.10.2018 15:17

В этом случае и handlePersonFetch(), и handleCityFetch() должны возвращать response.json(), чтобы при вызове этих методов в componentDidMount() вы выполняли setState как для person, так и для city оттуда.

Juan Marco 22.10.2018 14:27

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