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

时间:2009-01-02 18:12:27

标签: jquery ajax validation

假设我有以下jQuery 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
       }
   }
 });

这对我来说有点笨拙,但它确实有效。还有更好的选择吗?

5 个答案:

答案 0 :(得分:25)

就个人而言,我的库中有以下代码的代码。

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

jQuery docs Ajax/jQuery.ajaxSetup

将错误从服务器端(使用php)冒泡到客户端的最好方法是通过400的某处(始终与错误相关联)的Ajax请求发送标头。一旦Ajax请求收到此信息,它将触发您的错误功能。这也意味着您不必定义错误:在每个$ .ajax调用中调用。

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

来自w3.org header information

错误4xx,5xx 4xx代码用于客户端似乎有错误的情况,5xx代码用于服务器知道服务器出错的情况。通常不可能区分这些情况,因此差异只是信息性的。 主体部分可以包含描述人类可读形式的错误的文档。该文档为MIME格式,可能只有text / plain,text / html或者请求中指定为可接受的格式。

答案 1 :(得分:5)

$.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.
   }
 });

答案 2 :(得分:3)

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

答案 3 :(得分:0)

使用HTTP错误在服务器端返回错误代码,最好等同于错误。然后使用错误回调。这也可以让您显示网络服务器提供的错误。

答案 4 :(得分:0)

回答这个问题已经很晚了,但我认为使用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的地方我使用then jquery 承诺回电

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

它将根据从服务器收到的响应调用成功或错误函数。