我试着用Axios更好地理解javascript的承诺。我假装的是处理Request.js中的所有错误,并且只从任何地方调用请求函数,而不必使用catch()。
在本例中,对请求的响应将为400,其中包含JSON中的错误消息。
这是我正在犯的错误:
Uncaught (in promise) Error: Request failed with status code 400
我找到的唯一解决方案是在.catch(() => {})中添加Somewhere.js,但我试图避免这样做。有可能吗?
下面是代码:
Request.js
export function request(method, uri, body, headers) {
let config = {
method: method.toLowerCase(),
url: uri,
baseURL: API_URL,
headers: { 'Authorization': 'Bearer ' + getToken() },
validateStatus: function (status) {
return status >= 200 && status < 400
}
}
...
return axios(config).then(
function (response) {
return response.data
}
).catch(
function (error) {
console.log('Show error notification!')
return Promise.reject(error)
}
)
}Somewhere.js
export default class Somewhere extends React.Component {
...
callSomeRequest() {
request('DELETE', '/some/request').then(
() => {
console.log('Request successful!')
}
)
}
...
}发布于 2018-08-09 13:26:46
实际上,到目前为止,axios是不可能的。只属于2xx范围的状态码可以在.then()中捕获。
传统的方法是捕获catch()块中的错误,如下所示:
axios.get('/api/xyz/abcd')
.catch(function (error) {
if (error.response) {
// Request made and server responded
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
console.log(error.request);
} else {
// Something happened in setting up the request that triggered an Error
console.log('Error', error.message);
}
});另一种方法可以是在处理请求或响应之前拦截它们。
axios.interceptors.request.use(function (config) {
// Do something before request is sent
return config;
}, function (error) {
// Do something with request error
return Promise.reject(error);
});
// Add a response interceptor
axios.interceptors.response.use(function (response) {
// Do something with response data
return response;
}, function (error) {
// Do something with response error
return Promise.reject(error);
});发布于 2020-03-24 05:22:52
如果您想访问整个错误体,请执行如下所示的操作:
async function login(reqBody) {
try {
let res = await Axios({
method: 'post',
url: 'https://myApi.com/path/to/endpoint',
data: reqBody
});
let data = res.data;
return data;
} catch (error) {
console.log(error.response); // this is the main part. Use the response property from the error object
return error.response;
}
}发布于 2020-03-26 14:08:20
你可以这样走:error.response.data
在我的例子中,我从后端获得了error属性。所以,我用了error.response.data.error
我的代码:
axios
.get(`${API_BASE_URL}/students`)
.then(response => {
return response.data
})
.then(data => {
console.log(data)
})
.catch(error => {
console.log(error.response.data.error)
})https://stackoverflow.com/questions/49967779
复制相似问题