你如何处理来自AJAX调用的错误?

问题描述:

比方说,我有以下的jQuery AJAX调用:你如何处理来自AJAX调用的错误?

$.ajax({ 
    type: "POST", 
    url: "MyUrl", 
    data: "val1=test", 
    success: function(result){ 
     // Do stuff 
    } 
}); 

现在,当这个AJAX调用时我希望在服务器端代码通过一些错误处理检查运行(如在用户仍然登录,他们是否有权使用此通话,数据是否有效等)。如果检测到错误,我如何将该错误消息回传到客户端?

我最初的想法是返回一个带有两个字段的JSON对象:error和errorMessage。这些领域将在随后jQuery的AJAX调用进行检查:

$.ajax({ 
    type: "POST", 
    url: "MyUrl", 
    data: "val1=test", 
    success: function(result){ 
     if (result.error == "true") 
     { 
      alert("An error occurred: " & result.errorMessage); 
     } 
     else 
     { 
      // Do stuff 
     } 
    } 
}); 

这感觉有点笨重给我,但很有效。有更好的选择吗?

就个人而言,我在我的库类似的代码下面的代码。

$.ajaxSetup({ 
    error: function(xhr){ 
     alert('Request Status: ' + xhr.status + ' Status Text: ' + xhr.statusText + ' ' + xhr.responseText); 
    } 
}); 

jQuery docs Ajax/jQuery.ajaxSetup

气泡的最佳方式从服务器侧(使用PHP)到客户端侧的错误是通过Ajax请求在某处发送的报头400的(其总是与相关联错误)。一旦Ajax请求接收到它,它将触发你的错误函数。这也意味着您不必定义一个错误:在每个$ .ajax调用中调用。

header('HTTP/1.0 419 Custom Error'); 

报价从w3.org header information

错误4XX,5XX 的4XX代码用于在客户端似乎出现了偏差的情况下,以及在该服务器是知道的情况下,5XX码服务器发生了错误。一般不可能区分这些情况,所以区别仅仅是信息性的。 正文部分可能包含描述人类可读形式的错误的文档。该文档采用MIME格式,并且只能以text/plain,text/html格式或在请求中指定为可接受的格式之一。

不是jQuery ajax函数最后接受一个参数,一个回调失败的调用吗?如果是这样,只需在成功回调后添加fail:function(...){..}即可。

+0

我相信也有一个“错误”。 – BobbyShaftoe 2009-01-02 18:19:48

+0

是的,有一个“错误”回调,其工作方式与“成功”回调相同。但是,我不确定是否返回HTTP错误是最好的方法。 – 2009-01-02 18:27:50

使用HTTP错误返回服务器端的错误代码最好等同于错误是什么。然后使用错误回调。这也可以让你显示你的网络服务器给出的错误。

$.ajax({ 
    type: "POST", 
    url: "MyUrl", 
    data: "val1=test", 
    success: function(result){ 
     // Do stuff 
    }, 
    error: function(request,status,errorThrown) { 
     // There's been an error, do something with it! 
     // Only use status and errorThrown. 
     // Chances are request will not have anything in it. 
    } 
}); 

这是非常晚来回答这个问题,但我认为这将是对某一使用ES6和jQuery 2.2有益。

我一般遵循这个(延期法)在我的代码

sendAjaxRequest(URL, dataToSend) { 
    return $.ajax({ 
     type  : 'POST', 
     url   : URL, 
     data  : JSON.stringify(dataToSend), 
     dataType : 'json' 
    }).fail((responseData) => { 
     if (responseData.responseCode) { 
      console.error(responseData.responseCode); 
     } 
    }); 
}, 

我附上延期fail方法,如果出现一些错误,将被调用。这是另一种结构来错误回调选项,.fail()方法替代了最新的jQuery已过时.error()方法。

从调用sendAjaxRequest的地方接着我用jQuery的then承诺回调

sendAjaxRequest(URL, dataToSend) 
.then(
    (success) => { 
    }, 
    (error) => { 
    } 
); 

将基于从服务器接收到的响应调用成功或错误的功能。