2017-09-05 93 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