Laravel 8.2中Ajax始终触发success回调无法识别业务错误怎么办
问题原因
jQuery的$.ajax的error回调仅在请求出现网络异常、超时、返回HTTP状态码为4xx/5xx等非成功状态时才会触发。你当前的控制器代码不管业务逻辑成功还是失败,返回的HTTP状态码都是默认的200(成功状态),所以两种情况都会进入success回调。
解决方案
提供两种常用实现方式,任选其一即可:
方案1:后端返回对应业务状态的HTTP状态码(符合RESTful规范)
修改控制器代码,在业务判定失败时返回4xx类状态码,即可触发前端error回调:
public function destroy($id) { $user = User::find($id); if($user->type !== 0) { $user->delete(); return response()->json([ 'success'=>"Record deleted." ]); } else { // 第二个参数传入403(禁止访问)状态码 return response()->json([ 'error' => "You can not delete this" ], 403); } }
该方案不需要修改前端原有JS代码,业务失败时会自动触发error回调的提示。
方案2:前端在success回调中判断业务返回字段
不需要修改HTTP状态码,直接在success回调中根据返回的JSON字段判断业务结果,修改JS代码如下:
$(".deleteRecord").click(function(){ var id = $(this).data("id"); var token = $("meta[name='csrf-token']").attr("content"); if(confirm('Do you want to delete?')){ $.ajax( { url: "operDel/"+id, type: 'post', cache: false, data: { "id": id, "method": 'post', "_token": token, }, dataType: "json", // 接收返回的data参数 success: function(data) { if(data.success) { alert('Record is deleted'); } else if(data.error) { alert(data.error); } }, error: function() { alert('请求发生异常,请检查网络或重试'); } }); } });
该方案更灵活,可适配多种业务状态的提示需求。
内容的提问来源于stack exchange,提问作者Hayrulla Melibayev
相关产品推荐
相关产品推荐

