使用 Axios 从 laravel 控制器捕获错误

Posted

技术标签:

【中文标题】使用 Axios 从 laravel 控制器捕获错误【英文标题】:Capture error from laravel controller with Axios 【发布时间】:2018-09-25 16:10:55 【问题描述】:

¿我如何使用 Axios 从 Laravel 中的控制器方法中捕获错误?问题如下,当数据通过laravel中UserController中myProfile方法的validator并且正确时,方法中会生成一个json响应,然后axios将其取走并显示toast Success消息,但是当我通过时错误或空数据到验证器,这会失败,Axios 不会接收带有错误的 json,而是向我显示空 toast 并在控制台中生成错误 422。

用户控制器中的myProfile

public function myProfile(Request $request)

    $valido = $this->validate($request, [
        'firstname' => 'required|min:3|max:15',
        'lastname' => 'min:2|max:15',
        'gender' => 'numeric',
        'description' => 'max:200',
    ]);

    if($valido)
        return response()->json([
            'status' => 'success',
            'msg' => 'Ok',
        ], 201);
    
    else
        return response()->json([
            'status' => 'error',
            'msg' => 'Error',
        ], 422);
    


Profile.vue(Axios 部分)

updateUser()
        const value = 
            'id': this.user.id,
            'firstname': this.user.firstname,
            'lastname': this.user.lastname,
            'gender': this.user.gender,
            'description': this.user.description,
         

        axios.put('/dashboard/profile', value)
            .then((response) => 
                let title = response.data.status;
                let body = response.data.msg;
                this.displayNotificationSuccess(title, body);
            )
            .catch((error) => 
                let title = error.response.data.status;
                let body = error.response.data.msg;
                this.displayNotificationError(title,body);
            )
    

axios从控制器捕获json成功时的屏幕截图

Screenshot when Axios capture Success request

Axios 未从控制器捕获 json 错误时的屏幕截图

Error

来自控制台的屏幕截图,显示 json 错误没有被 axios 捕获

Error 422 in console

¿我怎样才能解决这个问题?我使用 Laravel 5.6、Vuejs 2 和 Axios

【问题讨论】:

控制器请求验证将在失败时抛出异常并立即返回响应。如果您查看控制台中的 422 响应,您会发现结构与您的预期不同。 @fubar,是的,我明白这一点,但是¿我该如何解决正在发生的事情?我是 Laravel 和 Vue 的新手 您可以在控制器中捕获异常,并返回您自己的错误响应。或者你调整 Axios 的 catch 函数来处理当前返回的 422 响应。 好的,¿你是怎么做到的? 【参考方案1】:

如果将validate() 方法调用包装在try/catch 块中,则可以捕获请求无效时抛出的ValidationException。这将允许您返回自己的响应。

我已经向您展示了下面的示例,并且还包括验证错误,如果您希望在前端输出这些错误。

<?php

use Illuminate\Validation\ValidationException;

public function myProfile(Request $request)

    try 
        $this->validate($request, [
            'firstname'   => 'required|min:3|max:15',
            'lastname'    => 'min:2|max:15',
            'gender'      => 'numeric',
            'description' => 'max:200',
        ]);

        return response()->json([
            'status' => 'success',
            'msg'    => 'Okay',
        ], 201);
    
    catch (ValidationException $exception) 
        return response()->json([
            'status' => 'error',
            'msg'    => 'Error',
            'errors' => $exception->errors(),
        ], 422);
    

【讨论】:

非常感谢@fubar!

以上是关于使用 Axios 从 laravel 控制器捕获错误的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - React,强制 Axios 进行拒绝/捕获

Laravel 从 5.5 升级到 5.6 到 5.7:未捕获 ReferenceError: axios is not defined

VueJS、Axios、Laravel - 捕获错误

如何使用 axios 将数组从 javascript 传递到 laravel 控制器

Laravel VueJS Axios 将数组发送到控制器

无法通过 Vue.js(Axios 帖子)从 Laravel 后端下载文件(pdf)