无法自定义表单错误,因为服务器正在返回422无法处理的实体而未返回错误

时间:2019-03-07 09:09:08

标签: javascript laravel vue.js axios http-status-code-422

我正在使用Laravel和VueJS,对于我所有的postput方法,服务器在提交表单后都会返回新创建的数据,如果出现错误,我无法从中访问它们browser console。这是我在newtwork tab中看到的。目的是根据服务器返回的错误来自定义表格错误

这是我的后端代码:

private function validateForm($data){
    return Validator::make($data,
    [
        'fname' => ['required', 'string','min:2' ,'max:255'],
        'lname' => ['required', 'string','min:2' ,'max:255'],
        // 'mname' => ['string','min:2' ,'max:255'],
        'company' => ['string','min:2' ,'max:255'],
        'title' => ['string','min:2' ,'max:255'],
        'phone_number' => ['string','min:13' ,'max:13'],
        'city' => ['required', 'string','min:2' ,'max:100'],
        'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
        'password' => ['required', 'string', 'min:8', 'confirmed']
        // 'password_confirm'=>['required','string']
    ]
  )->validate();
}
//Register
public function register(Request $request){
    $data=$this->validateForm($request->all());
    $data['password']=Hash::make($data['password']);
    $user=new User($data);
    $user->save();
    return response()->json($user);

}  

我的前端代码:

export default{
    data(){
        return {
            form:{
                email:'',
                password:'',
                password_confirmation:'',
                fname:'',
                lname:'',
                city:''
            },
            formError:''
        }
    },
    methods:{
        //This should be a POST method through axios
        register:async function(){
           try{
               const res=await axios.post('api/register',
               {
                   email:this.form.email,
                   password:this.form.password,
                   password_confirmation:this.form.password_confirmation,
                   fname:this.form.fname,
                   lname:this.form.lname,
                   city:this.form.city
               });
               //Une fois inscrit,il est redirige vers la page de login
               this.$router.push({path:'/login'});
               console.log("My data : ",res.data);
           }catch(err){
                   console.log("Errors",err);
           }

        }
    }
    }

如果没有错误,一切都会很好,但是如果有错误,这就是我在browser console tab中得到的内容:

Devtools console tab

Devtools network tab

Devtools network tab

我尝试了 Laracast

中的以下链接Issues with Axios catch method

how to display the errors in .catch coming from an api on frontend

还有其他一些解决方案,但是它们都不能解决我的问题。 在使用async-await pattern之前,我使用过axios.post('url',data).then(res=>...).catch(err=>...)

当我使用邮递员时,http status仍然是422,但是返回了error object,因此,使用postman时一切正常,但在browser中却没有,< / p>

Postman test

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

当您设置的验证失败时,Laravel返回$nodes = $xpath->evaluate( '//*|//text()[normalize-space(.) != ""]' ); 。对于您的情况,我将仔细研究一下您要发布到服务器上的数据,并手动检查它是否通过了您编写的验证案例。

要获取导致错误的确切字段,您需要在代码中进行处理,例如:

HTTP 422 - Unprocessable Entity

在您的代码中,应检查$validator = Validator::make($data, $rules); if ($validator->fails()) { // 500 is the HTTP Status Code you want to return. // This should also throw you in the catch branch of your front-end code return response()->json(['errors'=>$validator->errors()], 500); } 函数中的$data变量是否未通过验证并返回错误

答案 1 :(得分:0)

这是因为err在直接访问时将返回toString()方法,但具有以下属性:

err.response.data将满足您的需求。

答案 2 :(得分:0)

当Axios引发错误时,可以在error.response中找到HTTP响应。验证错误将在errors键中,因此您可以访问如下验证错误:

axios.post(someUrl, someData)
    .then(response => {
        // Successful response
    })
    .catch(error => {
        let errors = error.response.data.errors;
    });