使用 Axios 帖子捕获错误正文



我正在从后端代码发送状态代码 422,其中包含包含错误描述的响应正文。我正在使用如下 axios 帖子来发布请求:

post: function(url, reqBody) {
const request = axios({
baseURL: config.apiUrl,
url: url,
headers: {
'Content-Type': 'application/json',
'Authorization': sessionStorage.getItem('token')
},
method: 'POST',
data: reqBody,
responseType: 'json'
});
return request
.then((res) => {
return res;
})
.catch((error) => {
console.log(error);
return error;
})
}

问题是当后端返回错误代码 422 时,我捕获的错误对象没有关于响应正文的信息。有什么方法可以检索错误文本吗?

我遇到了同样的问题,答案(根据Axios>= 0.13(是专门检查error.response.data

axios({
...
}).then((response) => {
....
}).catch((error) => {
if( error.response ){
console.log(error.response.data); // => the response payload 
}
});

有关更多详细信息,请参阅此处。

AXIOS 错误响应的"正文"取决于请求的响应类型。

如果您想了解有关此问题的完整详细信息,可以查看此博客文章:如何在 AXIOS 中捕获错误的正文。

总之,AXIOS 将根据错误返回 3 个不同的主体:

错误的请求,
  1. 我们实际上在我们的请求中做错了什么(缺少参数,格式错误(,即实际上尚未发送。发生这种情况时,我们可以通过以下方式访问信息error.message.

    axios.get('wrongSetup')
    .then((response) => {})
    .catch((error) => {
    console.log(error.message);
    })
    
  2. 错误的网络请求:当我们尝试访问的服务器根本没有响应时,就会发生这种情况。这可能是由于服务器关闭或 URL 错误。 在这种情况下,我们可以通过以下方式访问请求的信息error.request.

    axios.get('network error')
    .then((response) => {})
    .catch((error) => {
    console.log(error.request );
    });
    
  3. 错误状态:这是最常见的请求。对于返回的状态不同于 200 的任何请求,都可能发生这种情况。它可能未经授权、未找到、内部错误等。当发生此错误时,我们能够通过访问以下代码片段中指定的参数来掌握请求的信息。对于数据(如上所述(,我们需要访问error.response.data.

    axios.get('errorStatus')
    .then((response) => {})
    .catch((error) => { 
    console.log(error.response.data);  
    console.log(error.response.status);  
    console.log(error.response.headers); 
    })
    

对于那些使用 await/async 和 Typescript 的人

try {
const response = await axios.post(url, body)
} catch (error) {
console.log(error.response.data);
}

对于反应原生,它对我有用

api.METHOD('endPonit', body)
.then(response => {
//...
})
.catch (error => {
const errorMessage = JSON.parse(error.request.response)
console.log(errorMessage.message)
})

>我们可以检查error.response.data,如@JoeTidee所说。但是,如果响应有效负载是 blob 类型?您可以使用以下代码获取错误响应正文。

axios({
...
}).then((response) => {
....
}).catch(async (error) => {
const response = error.response
if(typeof response.data.text === function){
console.log(await response.data.text()); // => the response payload 
} else {
console.log(response.data)
}
});

就我而言,我想检索响应 404 错误消息(正文(。 我得到了error.response.data的身体,但我无法显示它,因为类型是ArrayBuffer

溶液:

axios.get(url, { responseType: 'arraybuffer' }).then(
response => {...},
error => {
const decoder = new TextDecoder()
console.log(decoder.decode(error.response.data))
}
)

相关文章: 在字符串和数组缓冲区之间转换

我从后端返回一个字符串,但期望 json 作为响应类型。所以我需要返回一个对象而不是字符串,以便 axios 正确处理它。