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

275
我正在向我的jQuery发送错误响应。然而,我无法获取响应文本(在下面的示例中,这将是去海滩了)。
jQuery唯一说的是“error”。
详见以下示例: 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 代码中。你不需要在标题和正文之间加两个换行符吗?header 函数能处理这个吗? - rfunduk
thenduks:PHP知道它在做什么。问题在于,由于返回的HTTP状态是500,$.ajax()调用了传递给它的错误函数。 - Chris Charabaruk
13个回答

352

尝试:

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

149
我更倾向于使用JSON.parse(xhr.responseText)。 - Phil-R
82
"eval"很危险... https://dev59.com/EnRB5IYBdhLWcg3wXWO2 - German Latorre
24
在这里使用eval没有多大意义。如果你想解析一个JSON响应,请使用JSON.parse。在OP的情况下,响应甚至不是JSON或JavaScript,因此你的eval只会导致语法错误。 - Mark Amery
1
无论如何,这并不改变“xhr未定义”的事实。 - phil294
2
在我的情况下,所请求的服务器已关闭,既没有定义.responseText也没有定义.responseJSON - vladkras
显示剩余4条评论

73

对我来说,这很简单:

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

58

查看请求参数的 responseText 属性。


我在IE8中遇到了“解析器错误”问题,但是跨域JSONP请求在IE7中可以正常工作。但是响应文本属性在哪里?在调试期间检查响应对象时,我没有看到它的任何位置。我只看到$.ajax()请求对象的readyState、status、statusText和其他方法。 - NLV
xhr对象应该根据响应的MIME类型具有responseText或responseXML中的一个。 - tvanfosson
我找到了问题。实际上,当jquery创建JSONP请求时,根本不会创建XHR对象。JSON-Padding只是将动态脚本引用添加到指向URL的位置,并且json数据将被包装在一个方法中进行调用。因此,根本不使用XHR。 - NLV
在IE8和跨域方面遇到了问题,今天整整一天都在解决 :(. https://dev59.com/YF3Ua4cB1Zd3GeqP_lUT - NLV
你如何将responseText解析成JSON对象? - chovy

27

12

最好的简单方法:

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

8

这是对我有效的方法

    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

5

如果你想得到带有行号的语法错误,请使用以下方法:

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

我没有得到行号,但是当我调用$.get读取文件时,“alert(error)”确实给了我一个“未找到”的提示,这正是我需要的。xhr.responseText返回了一个404页面,告诉我该文件不存在。 - James Toomey
嗨,詹姆斯,如果出现“未找到”错误,这意味着无法找到“Url”或“Action”方法。 - Karthikeyan P

4
这将使您可以查看整个响应,而不仅仅是 "responseText" 值。
error: function(xhr, status, error) {
    var acc = []
    $.each(xhr, function(index, value) {
        acc.push(index + ': ' + value);
    });
    alert(JSON.stringify(acc));
}

4
你也可以尝试一下:
$(document).ajaxError(
    function (event, jqXHR, ajaxSettings, thrownError) {
        alert('[event:' + event + '], [jqXHR:' + jqXHR + '], [ajaxSettings:' + ajaxSettings + '], [thrownError:' + thrownError + '])');
    });

2
我使用了这个方法,结果非常完美。原始答案为"最初的回答"。
error: function(xhr, status, error){
     alertify.error(JSON.parse(xhr.responseText).error);
}

xhr.responseText返回{error:“发生错误...”}。然后,我使用JSON.parse来解析JSON。尝试使用。 - Juan Silupú Maza
如果您想对答案进行补充,请编辑答案。评论是临时的,而问题/答案更为永久。 - ejderuby
对我而言,以下代码有效:JSON.parse(xhr.responseText).message; - sfgroups

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接