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 2009年

thenduks:PHPは何をしているのかを知っています。問題は、返されるHTTPステータスが500であるため、$.ajax()渡されたエラー関数を呼び出すことです。
Chris Charabaruk、2009年

回答:


309

試してください:

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

127
JSON.parse(xhr.responseText)を使用したい
Phil-R


19
evalhere を使用してもあまり意味がありません。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

53

私にとっては、これは単に機能します:

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

51

responseTextリクエストパラメータのプロパティ。


IE8で「parsererror」の問題がありますが、IE7でクロスオリジンJSONPリクエストを処理しています。しかし、responseTextプロパティはどこにありますか?デバッグ中に応答オブジェクトを確認しているときに、どこにも表示されません。$ .ajax()リクエストオブジェクトのreadyState、status、statusTextおよびその他のメソッドのみが表示されます。
NLV 2011年

xhrオブジェクトには、応答のMIMEタイプに応じて、responseTextまたはresponseXMLのいずれかが必要です。
tvanfosson 2011年

問題が見つかりました。実際には、JSONPリクエストの作成中にjqueryがXHRオブジェクトを作成することはありません。JSON-Paddingは、URLを指す動的スクリプト参照が追加され、jsonデータが呼び出されるメソッドでラップされるだけです。したがって、XHRはまったく使用されません。
NLV 2011年

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)」を実行すると「Not Found」が表示されました。これが必要でした。xhr.responseTextから404ページが返され、ファイルが存在しないことがわかりました。
James Toomey

こんにちはジェームズ、 "Url"または "Action"メソッドが見つからないことを意味する "Not Found"エラーがスローされた場合。
Karthikeyan P


0

私はこれを使用しましたが、完全に機能しました。

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

xhr.responseTextは{error: "error in ....."}を返します。次に、iamはJSONの解析にJSON.parseを使用します。使用してみてください。
JuanSilupúMaza、

回答を追加したい場合は、回答を編集します。コメントは一時的で、質問/回答はより永続的です。
ejderuby

-1

ネットワークエラーが発生しておらず、バックエンドからエラーを表示したい場合は、十分な権限がないため、応答を200とエラーメッセージで処理します。次に、成功ハンドラーでdata.status == 'error'を確認します


1
なぜ200で浮上するのですか?200はOKステータスです。カスタムメッセージでエラーステータスを返す必要があります。
2013

私が使用するほとんどのAPIは、実際には200を返し、応答の本文内にエラーコードが含まれています。
チョービー2013

200以外の値を返すと、バックエンドからエラーコードまたはエラーメッセージを表示するときに問題が発生する可能性があります。200以外は、通常、ネットワーク上の理由により要求自体が失敗したことを示すために使用されます。たとえば、ユーザーに権限がないことを示すものではありません。このアプリでは、「MakeAPICall」でプロミスを使用して、200応答でエラーコードを探し、failメソッドの代わりにメソッドを起動しdoneます。すべてのリクエストは、コードとメッセージを含む「ステータス」オブジェクトを含むオブジェクトを返します。
chovy

1
権限については、en.wikipedia.org / wiki / HTTP_403。もう少し興味深い記事
questions / 7996569 /

403はかなり基本的な解釈です...そして、レスポンスボディを送信することはできません。私の許可はほんの一例でした。表示したいアプリ固有のエラーコードがあります。HTTPコードはこれらすべてを網羅しているわけではありません。
chovy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.