У меня есть база данных с 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 })
);
}
Похоже, код работает должным образом. Однако ошибка, похоже, возникает, когда вы извлекаете данные из базы данных (возможно, с использованием метода fetch, который объяснил бы TypeError обещания). Проверьте консоль, чтобы выяснить, какой файл выбрасывает undefined. Это должно дать вам лучшее представление о происхождении проблемы.
@SakoBu добавить в сообщение
@JuanMarco я добавил, чтобы опубликовать свой код получения. Проверьте пожалуйста, может проблема в этом
@ Джек Ну вот ...
Приведенный ниже код должен помочь вам продвинуться вперед, но мне также интересно, как выглядит ваше состояние по умолчанию в конструкторе ...
@SakoBu в состоянии по умолчанию у меня нет ... ничего. this.state = {город: [], человек: []}





Это неправильный способ обработки ошибок в обещаниях ... Измените на это:
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
В этом случае и handlePersonFetch(), и handleCityFetch() должны возвращать response.json(), чтобы при вызове этих методов в componentDidMount() вы выполняли setState как для person, так и для city оттуда.
Он сообщает вам, что произошла ошибка, но вы ее не уловили ... Опубликуйте код получения