VueJS、Axios、Laravel - 捕获错误

Posted

技术标签:

【中文标题】VueJS、Axios、Laravel - 捕获错误【英文标题】:VueJS, Axios, Laravel - catch errors 【发布时间】:2021-07-05 14:48:59 【问题描述】:

我正在使用以下代码向 Laravel 发布内容:

        upload: async function()      

        response = await axios.post(url, data, 
            headers: 
                'Content-Type': 'multipart/form-data',
            
        ).catch(function(error) 
            console.log(error.response.data.errors);
        );

(无关代码省略)

当 Laravel 返回 200 时,这总体上有效。 如果我从 Laravel Axios 返回 401、422 或其他内容,则会在控制台中引发错误并且整个方法停止运行。

我一直认为这是对开发人员非常不友好的行为 - 我不理解吗?从后端 API 返回不同的状态代码应该有助于读取 Vue 中的响应,但 Vue/Axios 将每个非 200 响应视为致命错误。

如何捕捉错误 - 做某事(并将 $this 绑定到回调)然后继续该方法而不杀死整个脚本?

【问题讨论】:

如果您阅读了accepted HTTP codes,axios 正在做应该做的事情。您认为重定向 (3xx) 是来自 API 的成功响应吗? 4xx/5xx 怎么样?如果你的代码在你得到4xx 时停止工作,那是因为你做错了,你使用async/await 的方式不好,你必须使用try/catch 而不是await + js.catch...这就是为什么您的代码停止工作... 【参考方案1】:

原因是 Axios 默认有一个这样的验证器功能:

 validateStatus: function (status) 
    return status >= 200 && status < 300; // default
 ,

状态码 300 及以上且小于 200 会使 axios 抛出异常。

您可以通过以下任一方式使其不抛出(停止进一步执行):

尝试..catch:

try 
    response = await axios.post(url, data, 
        headers: 
            'Content-Type': 'multipart/form-data',
        
    );
 catch (error) 
    this.doSomething() // this is available here

.catch 在 axios 上:

axios.post(url, data, 
    headers: 
        'Content-Type': 'multipart/form-data',
    
).catch(error => 
    console.log(error.response.data.errors);
);

注意:由于不使用异步/等待,这与您的示例不同

错误回调:

axios.post(url, data, 
    headers: 
        'Content-Type': 'multipart/form-data',
    
, error => 
    console.log(error.response.data.errors);
)

如果你不希望 Axios 强制你抛出 300 以上的状态码,你可以更改默认的 axios 验证器:

axios.defaults.validateStatus = (status) => 
    return status === 200; // your own logic here to throw or not.
;

【讨论】:

最佳答案,但我建议(对问题的作者)不要更改默认 Axios 的行为。它会使习惯此默认设置的其他任何人感到困惑...

以上是关于VueJS、Axios、Laravel - 捕获错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 axios vuejs 和 laravel 验证表单

在 Laravel 护照、vueJS 和 Axios 中获得未经授权的 401

CORS 块 Laravel + VueJS Axios

使用 axios.put [laravel + vuejs 3] 更新模式内的数据时出现错误 422

Vuejs Axios POST 请求从 Laravel 后端获取 HTTP422 错误

(axios) HTTP POST 请求两分钟后失败,Laravel 5 + VueJS