#reactjs #react-redux
#reactjs #реагировать-redux
Вопрос:
Я работаю над веб-приложением, использующим react-redux с node.js серверная часть. Я работал над добавлением страницы для добавления игр в профиль. Я получаю ошибку при запуске этого кода.
Это действие, которое он использует, когда я получаю ошибку
export const addGames = (gameData, history) => dispatch => {
axios
.post("/api/profile/games", gameData)
.then(res => history.push("/dashboard"))
.catch(err =>
dispatch({
type: GET_ERRORS,
payload: err.response.data
})
);
};
Сама страница загружается отлично. только при вызове действия оно выдает ошибку. Это указывает на оператор catch, когда он выдает ошибку.
Выполнение вызова API через postman возвращается, как ожидалось, и не выдает ошибки.
ошибка, которую я получаю, это
×
Unhandled Rejection (TypeError): Cannot read property 'data' of undefined
eval
C:devSocialNetworkTutorialdevConnectorclientsrcactionsprofileActions.js:48:14
45 | axios
46 | .post("/api/profile", profileData)
47 | .then(res => history.push("/dashboard"))
> 48 | .catch(err =>
| ^ 49 | dispatch({
50 | type: GET_ERRORS,
51 | payload: err.response.data
Комментарии:
1. в чем тогда фактическая ошибка?
2. отредактированный пост, чтобы включить ошибку
3. Почему вы ожидаете, что у
err
будетresponse
поле? Попробуйте выйти из системы и посмотреть, что доступно. Это объект ошибки, поэтому, как минимум, у него должно бытьmessage
поле4. Попробуйте выйти из объекта err с помощью JSON.stringify, чтобы вы могли видеть структуру. Ошибка, похоже, предполагает, что структура не соответствует вашим ожиданиям (ошибка.response.data). .catch(ошибка => console.log(JSON.stringify(ошибка)) )
Ответ №1:
Спасибо всем за ответ. Я понял это. Что я сделал, так это консольный журнал err.message, как рекомендовано, и это выдало мне ошибку
Не удается прочитать свойство ‘push’ неопределенного типа
Это заставило меня взглянуть на историю.часть кода, в которой предполагается, что история кода, возможно, не была передана правильно.
Я понял свой основной код для onSubmit, который у меня был
onSubmit(e) {
e.preventDefault();
const gameData = {
name: this.state.name,
handle: this.state.handle,
platform: this.state.platform,
rank: this.state.rank
};
this.props.addGames(gameData, this.props.games);
}
Затем я понял, что this.props.addGames(gameData, this.props.games);
это нужно изменить на this.props.addGames(gameData, this.props.history);
Ответ №2:
Тогда проблема в том, что err.response
объект axios будет присутствовать, только если хост возвращает ответ, но находится за пределами 2xx
диапазона кода состояния.
Если хост выдает ошибку до возврата ответа или если возникает проблема с вашим первоначальным запросом, то err.response
свойство не будет существовать и, следовательно, err.response.data
выдаст исключение.
Наиболее тщательным способом обработки ошибок было бы что-то вроде этого из axios docs…
.catch(function (error) {
const errorMessage = (()=> {
if (error.response) {
// The request was made and the server responded with a status code
// that falls out of the range of 2xx
console.log(error.response.data);
console.log(error.response.status);
console.log(error.response.headers);
return error.response.data;
} else if (error.request) {
// The request was made but no response was received
// `error.request` is an instance of XMLHttpRequest in the browser and an instance of
// http.ClientRequest in node.js
console.log(error.request);
return error.request;
} else {
// Something happened in setting up the request that triggered an Error
console.log('Error', error.message);
return error.message;
}
})();
dispatch({
type: GET_ERRORS,
payload: errorMessage
})
});