2017-09-05 91 views
1

我在控制器中有這部分代碼,但是當我做這個動作和IF工作正常,錯誤消息出現在控制檯日誌中。拋出異常,但JSON響應獲取狀態SUCCESS

但它看起來像'成功'具有地位。而且它不應該

Try { 
    if ($last['date']) { 
     if ($last['date']->format('d-m-Y') == $par['date']) { 
       throw new \Exception('error', 500); 
      } 
    } 

    return new JsonResponse([ 
     'success' => true, 
     'data' => $content, 
     'message' => 'success' 
    ]); 
} catch (\Exception $exception) { 

    return new JsonResponse([ 
     'success' => false, 
     'code' => $exception->getCode(), 
     'message' => $exception->getMessage(), 
    ]); 
} 

JQuery的

$.ajax({ 
    type: "POST", 
    url: "/app/url", 
    data: TableData, 
    dataType: "json", 
    success: function(response){ 
     console.log(response.message); 
     $('#message').html('<p class="alert alert-success">' + response.message + '</p>'); 
    }, 
    error: function (response) { 
     console.log(response.message); 
     $('#message').html('<p class="alert alert-danger">' + response.message + '</p>'); 
    } 
}); 
+2

要報告錯誤,您必須返回400或500範圍內的HTTP響應。在您當前的實施中,您提出了成功回覆的請求。該響應包含一段Json,它正好具有屬性「success」,其值爲「false」,但您的Ajax調用並不知道這表明了錯誤。您可以通過解析響應來在JavaScript中實現,但更好,更純粹的方法是讓PHP返回適當的錯誤響應代碼。請參閱[HTTP狀態代碼](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes) – GolezTrol

+0

但是,當我拋出異常時不應該使用CATCH塊嗎? – Ferror

+0

好吧,所以不要拋出異常,我應該重新成功迴應:錯誤 – Ferror

回答

1

你的AJAX代碼接收爲success響應每一次,無論JSON內容,因爲你總是發送200反應(這是成功)。告訴AJAX來處理響應爲錯誤(並轉至error方法,而不是success方法在你的AJAX響應處理器),您需要在響應中發送的錯誤代碼,即400,像這樣:

return new JsonResponse([ 
     'success' => false, 
     'code' => 400, 
     'message' => $exception->getMessage(), 
    ], 400); 

所以,如果你拋出你的自定義Exception s,你需要根據它們真實的HTTP含義來設置每個屬性的code屬性。

現在,AJAX中的successerror處理程序具有不同的參數。在success中,第一個參數是data,簡單地說是從服務器返回的數據。另一方面,在error中,第一個參數是jqXHR對象。爲了訪問這個對象中的數據,你有一些不同的參數,但是現在你需要的是,因爲你有JSON,所以現在需要的是jqXHR.responseJSON。所以,現在你的錯誤信息將在response.responseJSON.message,而不是在response.message。查看更多關於here

+0

你能告訴我如何從你的答案jsonRespon獲得錯誤信息嗎? 舊的方式給我UNDEFINED(我的愛) – Ferror

+1

你的'error'方法中的數據現在在'response.responseJSON'中,所以用'response.responseJSON.message'來獲取它。爲了進一步調試,把'console.log(response);'放在錯誤處理程序中,這樣你就可以看到所有的響應對象了。 – ishegg

+0

我編輯了答案,提到這一點。 – ishegg