这对我来说是新的,我试图弄清楚当使用yield generator(redux-saga)发生axios错误时如何检索请求正文
这是我正在使用的一段代码:
function requestLogin(user: ILoginUserPayload) {
const loginUrl = `${config.apiUrl}/auth/logIn`;
return axios.post(loginUrl, user);
}
export default function* watchAuthAction(): IterableIterator<any> {
while (true) {
const { payload }: { payload: ILoginUserPayload} = yield take(TYPES.LOGIN_REQUEST);
console.log(`Payload`, payload);
try {
const response = yield requestLogin(payload);
console.log(`Response`, response);
} catch (error) {
// According to my debug, error.request contains all the axios info
console.log(error.request.response);
yield put({ type: TYPES.LOGIN_FAILURE, error: error.request.response.message });
}
}
}
我使用VSCode调试错误内容,发现其中包含axios请求信息(我是说,我99%确信axios会抛出错误,并且它来了)
我的身体反应如下:
{"message":"User doesn't exist","stack":"Error: User doesn't exist"}
所以我尝试通过以下方式获得它:
console.log(error.request.response.message);
但是它不起作用,也许我忘记了关于axios的东西...
有什么主意吗?
编辑:我实际上正在阅读此部分:https://github.com/axios/axios#handling-errors 但我仍然无法获取数据:/
答案 0 :(得分:1)
您的代码似乎正确,对我来说唯一的不同是:
try {
const response = yield call(apiCall, action.payload)
yield put({ type: successReducer, payload: response });
} catch(error) {
// Construct an error message
let errorMessage = error.response.status + ":"+ error.response.statusText;
yield put({ type: failReducer, payload: { message : errorMessage }});
}
所以对我来说,区别似乎在于我改为访问error.response.status 错误。请求。响应
答案 1 :(得分:0)
所以这是我所期望的一个axios错误。
我只是按照文档获取数据:)
这是部分:
axios.get('/user/12345')
.catch(function (error) {
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);
} 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);
} else {
// Something happened in setting up the request that triggered an Error
console.log('Error', error.message);
}
console.log(error.config);
});
就我而言,我只需要使用以下信息即可获取消息:
error.response.data.message
答案 2 :(得分:0)
伙计,我花了好几个小时。
这对我有用:
console.log(error.response.data.message);
因此,在您的 error
对象中,有一个 response
对象,然后您可以访问 data
对象中的所有内容。
try {
const response = yield requestLogin(payload);
console.log(`Response`, response);
} catch (error) {
yield put({ type: TYPES.LOGIN_FAILURE, error: error.response.data.message });
}
您可以像这样在 catch 中调试它:
catch (error) {
console.log('erro:', error.response.data.message)
}