【问题标题】:How to get the jQuery $.ajax error response text?如何获取 jQuery $.ajax 错误响应文本?
【发布时间】:2010-12-10 20:33:25
【问题描述】:

我正在向我的 jQuery 发送错误响应。 但是,我无法获得响应文本(在下面的示例中,这将是 Gone to the beach

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 函数能处理这个吗?
  • thenduks:PHP 知道它在做什么。问题是因为返回的 HTTP 状态是 500,$.ajax() 调用了传递给它的错误函数。

标签: php javascript jquery ajax error-handling


【解决方案1】:

试试:

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

【讨论】:

【解决方案2】:

对我来说,这很有效:

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

【讨论】:

    【解决方案3】:

    查看请求参数的responseText属性。

    【讨论】:

    • 我在 IE8 中有一个“解析器错误”问题,但正在 IE7 中处理跨域 JSONP 请求。但是 responseText 属性在哪里?在调试期间检查响应对象时,我在任何地方都看不到它。我只看到了 $.ajax() 请求对象的 readyState、status、statusText 和其他方法。
    • xhr 对象应具有 responseText 或 responseXML,具体取决于响应的 MIME 类型。
    • 我发现了问题。实际上,jquery 在创建 JSONP 请求时根本不会创建 XHR 对象。 JSON-Padding 只是添加了指向 URL 的动态脚本引用,并且 json 数据将使用被调用的方法包装。所以根本不使用XHR。
    • 遇到 IE8 和跨域问题。今天花了一整天:(。stackoverflow.com/questions/8165557/…
    • 如何将 repsponseText 解析为 json 对象?
    【解决方案4】:

    正如this other answer and it's comments 在此页面上的最终建议:

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

    【讨论】:

      【解决方案5】:

      最好的简单方法:

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

      【讨论】:

        【解决方案6】:

        这对我有用

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

        【讨论】:

        • xhr.responseJSON 也可用。所以我们可以避免 $.parseJSON(xhr.responseText)
        【解决方案7】:

        如果你想得到带有行号的语法错误,使用这个

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

        【讨论】:

        • 我没有得到行号,但是当我调用 $.get 来读取文件时,“alert(error)”确实给了我一个“未找到”,这正是我所需要的。 xhr.responseText 返回一个 404 页面,告诉我该文件不存在。
        • 嗨,James,如果它抛出“Not Found”错误,这意味着无法找到“Url”或“Action”方法。
        【解决方案8】:

        你也可以试试:

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

        【讨论】:

          【解决方案9】:

          这将允许您查看整个响应,而不仅仅是“responseText”值

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

          【讨论】:

            【解决方案10】:

            我用过这个,效果很好。

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

            【讨论】:

            • xhr.responseText 返回 {error:"error in ....."}。然后,我使用 JSON.parse 解析 JSON。尝试使用。
            • Edit 如果您想添加任何内容,请回答。评论是暂时的,而问题/答案是永久的。
            【解决方案11】:

            err.responseText 包含 HTML 标签,您可以轻松地从这些标签中获取错误消息...
            例如:

            $(err.responseText)
            // k.fn.init(12) [text, title, text, meta, text, style, text, span, text, font, text, //comment]
            
            $.ajax({
                async: bAsync,
                type: 'POST',
                url: pUrl,
                contentType: 'application/json; charset=utf-8;',
                dataType: 'json',
                data: pData,
                success: fn,
                error: function(err) {
                    alert( $($(err.responseText)[1]).text() )
                    debugger;
                }
            });
            

            【讨论】:

              【解决方案12】:

              如果您没有遇到网络错误,并且希望从后端显示错误(例如权限不足),请使用 200 和错误消息来响应您的响应。然后在您的成功处理程序中检查 data.status == 'error'

              【讨论】:

              • 为什么要使用 200? 200 为正常状态。他应该返回带有自定义消息的错误状态。
              • 我使用的大多数 api 实际上在响应正文中返回 200 和错误代码。
              • 当您想从后端显示错误代码或错误消息时,返回 200 以外的值可能会出现问题。 non-200 通常用于表示请求本身由于网络原因而失败......而不是例如用户没有权限。在我们的应用程序中,我们在“MakeAPICall”中使用了 Promise,它在 200 响应中查找错误代码并触发 fail 方法而不是 done 方法。所有请求都返回一个对象,该对象包含一个带有代码和消息的“状态”对象。
              • en.wikipedia.org/wiki/HTTP_403 获得许可。一些更有趣的阅读在这里stackoverflow.com/questions/7996569/…
              • 403 是非常基本的解释......而且您不能发送响应正文。我的许可只是一个例子。我想显示一些特定于应用程序的错误代码。 HTTP 代码并不包含所有这些。
              猜你喜欢
              • 1970-01-01
              • 2012-02-22
              • 1970-01-01
              • 1970-01-01
              • 2013-02-12
              • 1970-01-01
              • 2016-10-29
              • 2011-08-16
              • 2011-04-27
              相关资源
              最近更新 更多