如何获取jQuery $ .ajax错误响应文本?


234

我正在向我的jQuery发送错误响应。但是,我无法获得响应文本(在下面的示例中,这将变成海滩

jQuery唯一说的是“错误”。

有关详细信息,请参见以下示例:

的PHP

<?
    header('HTTP/1.1 500 Internal Server Error');
    print "Gone to the beach"
?>

jQuery的

$.ajax({
    type:     "post",
    data:     {id: 0},
    cache:    false,
    url:      "doIt.php",
    dataType: "text",
    error: function (request, error) {
        console.log(arguments);
        alert(" Can't do because: " + error);
    },
    success: function () {
        alert(" Done ! ");
    }
});

现在我的结果是:

日志:

 [XMLHttpRequest readyState=4 status=500, "error", undefined]

警报:

无法执行,因为:错误

有任何想法吗?


问题似乎出在您的php代码中。您在标题和正文之间是否不需要2个换行符?是否header函数处理呢?
rfunduk

thenduks:PHP知道它在做什么。问题在于,由于返回的HTTP状态为500,因此$.ajax()调用传递给它的错误函数。
克里斯·查拉巴鲁克

Answers:


309

尝试:

error: function(xhr, status, error) {
  var err = eval("(" + xhr.responseText + ")");
  alert(err.Message);
}

127
我更喜欢使用JSON.parse(xhr.responseText)
Phil-R


19
eval这里使用an 没有多大意义。如果要解析JSON响应,请使用JSON.parse。在OP的情况下,响应甚至不是JSON或JavaScript,因此您eval只会引起SyntaxError。
Mark Amery 2014年

1
JSON.parse需要IE8 +。(developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…)。如果需要支持旧版浏览器,请使用$ .parseJSON(来自jQuery,api.jquery.com/jQuery.parseJSON
朱利安(Julian

1
不会改变xhr未定义的事实
phil294 '16

53

对我来说,这很简单:

error: function(xhr, status, error) {
  alert(xhr.responseText);
}

51

查看responseText请求参数的属性。


我在IE8中遇到“ parsererror”问题,但在IE7中正在处理跨域JSONP请求。但是responseText属性在哪里?在调试期间检查响应对象时,我在任何地方都看不到它。我只看到readyState,status,statusText和$ .ajax()请求对象的其他方法。
NLV

xhr对象应具有responseText或responseXML,具体取决于响应的MIME类型。
tvanfosson 2011年

我发现了问题。实际上,jquery在创建JSONP请求时根本不会创建XHR对象。JSON-Padding只是添加了指向URL的动态脚本引用,而json数据将被调用的方法包装。因此根本不使用XHR。
NLV

IE8和跨域有问题。今天花了整整一天:(。stackoverflow.com/questions/8165557/…–
NLV

如何将repsponseText解析为json对象?
chovy


7

这对我有用

    function showErrorMessage(xhr, status, error) {
        if (xhr.responseText != "") {

            var jsonResponseText = $.parseJSON(xhr.responseText);
            var jsonResponseStatus = '';
            var message = '';
            $.each(jsonResponseText, function(name, val) {
                if (name == "ResponseStatus") {
                    jsonResponseStatus = $.parseJSON(JSON.stringify(val));
                     $.each(jsonResponseStatus, function(name2, val2) {
                         if (name2 == "Message") {
                             message = val2;
                         }
                     });
                }
            });

            alert(message);
        }
    }

2
xhr.responseJSON也可用。因此我们可以避免$ .parseJSON(xhr.responseText)
Prasanth

4

这将使您不仅看到“ responseText”值,还可以看到整个响应

error: function(xhr, status, error) {
    var acc = []
    $.each(xhr, function(index, value) {
        acc.push(index + ': ' + value);
    });
    alert(JSON.stringify(acc));
}

3

您也可以尝试:

$(document).ajaxError(
    function (event, jqXHR, ajaxSettings, thrownError) {
        alert('[event:' + event + '], [jqXHR:' + jqXHR + '], [ajaxSettings:' + ajaxSettings + '], [thrownError:' + thrownError + '])');
    });

3

如果要获取行号语法错误,请使用此

error: function(xhr, status, error) {
  alert(error);
}

我没有获得行号,但是当我调用$ .get读取文件时,“ alert(error)”的确给了我一个“未找到”,这正是我所需要的。xhr.responseText返回一个404页面,告诉我该文件不存在。
James Toomey 2015年

詹姆斯,您好,如果抛出“未找到”错误,则意味着找不到“ Url”或“ Action”方法。
Karthikeyan P

3

最好的简单方法:

error: function (xhr) {
var err = JSON.parse(xhr.responseText);
alert(err.message);
}

0

我使用了它,并且效果很好。

error: function(xhr, status, error){
     alertify.error(JSON.parse(xhr.responseText).error);
}

xhr.responseText返回{error:“ ....”中的错误“}。然后,iam使用JSON.parse解析JSON。尝试使用。
JuanSilupúMaza

如果要添加答案,请编辑答案。评论是暂时的,而问题/答案则是永久的。
ejderuby

-1

如果您没有网络错误,并且想从后端暴露一个错误,那么由于特权不足,请使用200和错误消息来作为响应的服务器。然后在您的成功处理程序中检查data.status =='error'


1
为什么用200浮出水面?200为OK状态。他应该使用自定义消息返回错误状态。
Dementic

我使用的大多数API实际上都会在响应正文中返回200并带有错误代码。
chovy

当您想显示来自后端的错误代码或错误消息时,返回200以外的值可能会有问题。非200通常用于指示请求本身由于网络原因而失败...例如,不是用户没有权限。在我们的应用程序中,我们在“ MakeAPICall”中使用promise,该promise在200响应中查找错误代码,并触发该fail方法而不是该done方法。所有请求都返回一个对象,该对象包含带有代码和消息的“状态”对象。
chovy


403是非常基本的解释...您无法发送响应正文。我的许可只是一个例子。我想显示一些特定于应用程序的错误代码。HTTP代码不包含所有这些。
chovy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.