【问题标题】:JS Axios - how to get response body in event of error?JS Axios - 如何在发生错误时获取响应正文?
【发布时间】:2019-05-06 07:59:55
【问题描述】:

我希望能够从 Axios 错误捕获中获取响应正文。

我正在使用 axios v0.18.0。

我的 axios 代码如下所示:

let service = axios.create({
                baseURL: "https://baseUrl.azurewebsites.net",
                responseType: "json"
            });

        service.defaults.headers.common['authorization'] = `Bearer ${token}`;

        service.post("/api/method", params).then(result => {
            console.log('success',result);
        }).catch(error=>{
            console.log('error');
            console.log(error);
        });

根据我的输入,我的 API 调用返回 400 错误,正如我所料。所以我正在击中catch块。但是我无法检索 API 调用返回的错误消息。

我尝试过执行 console.out(error.response.data),但这返回 null。

我已使用 Postman 验证 API 调用确实在响应正文中返回错误消息,因此 API 不是问题。

我错过了什么?

【问题讨论】:

    标签: javascript error-handling axios


    【解决方案1】:

    我用Mocky测试过,确实在error.response.data中返回了错误信息。

    const axios = require('axios');
    
    // http://www.mocky.io/v2/5c06f6be3000009600d25953 (the mock api to call, it always returns 400 with an error message)
    
    let service = axios.create({
        baseURL: "http://www.mocky.io",
        responseType: "json"
    });
    
    service.post("/v2/5c06f6be3000009600d25953").then(result => {
        console.log('success', result);
    }).catch(error => {
        console.log(error.response.data);
    });
    

    上面的代码打印Ooops, bad request!,作为返回。

    编辑:显然,您描述的问题可能由于多种原因而发生。请参阅this 问题。

    【讨论】:

    • 感谢您的来信。我运行了您的代码,但没有看到“糟糕,请求错误!”被退回;我得到“空”。我还阅读了您引用的链接。 jacurtis (github.com/axios/axios/issues/960#issuecomment-398269712) 评论说必须查看 error.response.data 或 error.response.data.data,但这些都是非空的。
    • 奇怪...我做了一个Codepen 并且发生了同样的问题。但如果我使用 Node 在本地运行,它就可以工作。
    • 修改我之前的评论...我的意思是error.response.data和error.response.data.data 都是空的。所以似乎没有一种直接的方法来获取错误响应。
    • Axios 自动读取正文 400 但不是 500,我正在寻找一种配置方法...
    【解决方案2】:

    这是我解决问题的方法。

    let options = {
        baseURL: "http://www.mocky.io",
        responseType: "application/json"
    };
    
    //service.post("/v2/5c06f6be3000009600d25953",{}).then(result => {
    axios.post("/v2/5c06f6be3000009600d25953",null,options).then(result => {
        console.log('success', result);
    }).catch(error => {
        console.log(error.response);
    });
    

    主要的修改是将“responseType”改为“application/json”。

    感谢大家的帮助。

    【讨论】:

      猜你喜欢
      • 2018-12-30
      • 2021-08-15
      • 2019-12-07
      • 2023-02-15
      • 1970-01-01
      • 2012-05-10
      • 2018-09-27
      • 2020-08-10
      • 1970-01-01
      相关资源
      最近更新 更多