Axios.即使API返回404错误,如何在try catch finally中获得错误响应

ar7v8xwq  于 2023-10-18  发布在  iOS
关注(0)|答案(4)|浏览(178)

用于例如

(async() => {
  let apiRes = null;
  try {
    apiRes = await axios.get('https://silex.edgeprop.my/api/v1/a');
  } catch (err) {
    console.error(err);
  } finally {
    console.log(apiRes);
  }
})();

finally中,apiRes将返回null。
即使当API得到404响应时,响应中仍然有我想要使用的有用信息。
当axios抛出错误时,如何使用finally中的错误响应。
https://jsfiddle.net/jacobgoh101/fdvnsg6u/1/

c9x0cxw0

c9x0cxw01#

根据文档,完整的响应作为错误的response属性提供。
所以我会在catch块中使用该信息:

(async() => {
  let apiRes = null;
  try {
    apiRes = await axios.get('https://silex.edgeprop.my/api/v1/a');
  } catch (err) {
    console.error("Error response:");
    console.error(err.response.data);    // ***
    console.error(err.response.status);  // ***
    console.error(err.response.headers); // ***
  } finally {
    console.log(apiRes);
  }
})();

Updated Fiddle
但是如果你想把它放在finally中,只需要把它保存到一个变量中就可以了:

(async() => {
  let apiRes = null;
  try {
    apiRes = await axios.get('https://silex.edgeprop.my/api/v1/a');
  } catch (err) {
    apiRes = err.response;
  } finally {
    console.log(apiRes); // Could be success or error
  }
})();
6tr1vspr

6tr1vspr2#

根据AXIOS文档(此处:https://github.com/axios/axios)你可以在config对象中传递validateStatus: false给任何axios请求。
例如

axios.get(url, { validateStatus: false })
axios.post(url, postBody, { validateStatus: false })

你也可以像这样传递一个函数:validateStatus: (status) => status === 200根据文档,默认行为是如果(200 <= status < 300)则返回true的函数。

p5fdfcr1

p5fdfcr13#

您可以处理状态码:
使用Ts进行重复:

let conf: AxiosRequestConfig = {};

    conf.validateStatus = (status: number) => {
        
        return (status >= 200 && status < 300) || status == 404
    }

    let response = await req.get(url, conf);
frebpwbc

frebpwbc4#

关于可接受的解{ validateStatus: false }
同样重要的是要注意,您仍然会在axios.get(...)行上看到相同的错误消息
然而,代码在“.then(...)”部分继续。这是一个奇怪的行为,花费了我很多测试时间,因为我认为设置没有影响。

相关问题