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]

경보:

할 수없는 이유 : error

어떤 아이디어?


PHP 코드에 문제가있는 것 같습니다. 헤더와 본문 사이에 2 개의 줄 바꿈이 필요하지 않습니까? header함수가 이것을 처리 합니까 ?
rfunduk

thenduks : PHP는 무엇을하고 있는지 알고 있습니다. 문제는 HTTP 상태가 500이기 때문에 $.ajax()전달 된 오류 함수를 호출한다는 것입니다.
Chris Charabaruk

답변:


309

시험:

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

127
JSON.parse (xhr.responseText)를 사용하는 것을 선호합니다
Phil-R


19
eval여기를 사용하는 것은별로 의미가 없습니다. JSON 응답을 구문 분석하려면을 사용하십시오 JSON.parse. OP의 경우 응답은 JSON 또는 JavaScript가 아니기 때문에 evalSyntaxError가 발생합니다.
Mark Amery

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'문제가 있지만 교차 출처 JSONP 요청을 위해 IE7에서 작동하고 있습니다. 그러나 responseText 속성은 어디에 있습니까? 디버깅 중에 응답 객체를 확인하는 동안 어디서도 볼 수 없습니다. readyState, status, statusText 및 $ .ajax () 요청 객체의 다른 메소드 만 보입니다.
NLV

xhr 객체에는 응답의 MIME 유형에 따라 responseText 또는 responseXML이 있어야합니다.
tvanfosson

나는 문제를 발견했다. 실제로 JSONP 요청을 만드는 동안 jquery는 XHR 객체를 전혀 만들지 않습니다. JSON 패딩은 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)"에 "Not Found"가 표시되었습니다. xhr.responseText가 파일이 존재하지 않는다는 404 페이지를 리턴했습니다.
James Toomey

James, "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 : "error in ....."}를 반환합니다. 그런 다음 iam은 JSON을 구문 분석하기 위해 JSON.parse를 사용합니다. 사용해보십시오.
Juan Silupú Maza

답변을 추가하려면 답변을 편집 하십시오. 의견은 일시적이며 질문 / 답변은 영구적입니다.
ejderuby

-1

네트워크 오류가없고 백엔드에서 오류를 표시하려는 경우 권한이 충분하지 않은 경우 응답을 200으로 표시하고 오류 메시지를 표시하십시오. 그런 다음 성공 처리기에서 data.status == 'error'를 확인하십시오.


1
왜 표면이 200입니까? 200은 정상 상태입니다. 사용자 지정 메시지와 함께 오류 상태를 반환해야합니다.
치매

내가 사용하는 대부분의 API는 실제로 응답 본문 안에 오류 코드가있는 200을 반환합니다.
chovy

백엔드에서 오류 코드 또는 오류 메시지를 표시하려는 경우 200 이외의 것을 리턴하면 문제가 될 수 있습니다. 비 200은 일반적으로 네트워크 이유로 인해 요청 자체가 실패했음을 나타내는 데 사용됩니다. 예를 들어 사용자에게 권한이없는 것은 아닙니다. 우리의 응용 프로그램에서, 우리는 "MakeAPICall"에서 약속을 사용합니다. 200 약속에서 오류 코드를 찾고 fail메소드 대신 메소드를 실행합니다 done. 모든 요청은 코드와 메시지가있는 '상태'객체가 포함 된 객체를 반환합니다.
chovy

1
권한은 en.wikipedia.org/wiki/HTTP_403 입니다. 좀 더 흥미로운 여기를 읽어보십시오 stackoverflow.com/questions/7996569/…
Dementic

403은 매우 기본적인 해석이며 응답 본문을 보낼 수 없습니다. 나의 허락은 단지 예일뿐입니다. 앱별로 오류 코드를 표시하고 싶습니다. HTTP 코드는이 모든 것을 포함하지는 않습니다.
chovy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.