2017-10-05 5 views
-1

원격 파일을 읽으려고합니다.JQuery를 사용하여 원격 파일을 읽는 방법 (jqXHR 읽기 오류가 발생 함)

var jqxhr = $.get('http://stackoverflow.com/feeds/question/10943544', function() { 
 
         alert('success'); 
 
         }) 
 
    .done(function() { 
 
        alert('second success'); 
 
        }) 
 
    .fail(function(jqXHR, textStatus, errorThrown) { 
 
        // alert('error'); 
 
        console.log('Error: (' + errorThrown + ')'); 
 
    }) 
 
    .always(function() { 
 
    alert('finished'); 
 
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

그러나 그것은 단지 "항상" "실패"트리거와 나는 이유를 이해하고 싶습니다; 나는 the example on the jquery.get() documentation page을 사용하고 있습니다 내 질문 : 읽을 수있는 오류를 어떻게 얻을 수 있습니까? 현재 console.log("Error: (" + errorThrown + ')');Error:()만을 산출합니다.

보너스 질문 : 왜 실패합니까? JS/JQuery를 사용하여 원격 (RSS) 파일을 읽는 방법은 무엇입니까?

+0

'textStatus' <- 너 봤어? – epascarello

+1

오류에 따라 다릅니다. 모든 오류 정보가 코드에 도달 할 때까지 읽을 수있는 것은 아닙니다. –

답변

1

Same Origin Policy 중 하나입니다.이 문제는 대부분의 AJAX 요청에 있으며 보안 수단으로 사용됩니다. jqXHR()을 보면 이 0 인 것을 알 수 있습니다. readyState은 요청이 실패하거나 정책 제한 또는 잘못된 요청 인 경우 항상 0이됩니다. 제한 사항으로 인해 오류 메시지 자체가 트리거되지 않으므로 error 메시지가 비어 있습니다.

var jqxhr = $.get("http://stackoverflow.com/feeds/question/10943544", function(res) { 
 
    alert("success"); 
 
    }) 
 
    .done(function() { 
 
    alert("second success"); 
 
    }) 
 
    .fail(function(jqXHR, textStatus, errorThrown) { 
 
    // alert("error"); 
 
    console.log("Error: (" + errorThrown + ')'); 
 
    }) 
 
    .always(function(jqXHR) { 
 
    console.log(jqXHR); 
 
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

이 해결하기 위해, this answer에 나와있는 플러그인의 수는 있습니다. 또한 상태 :

이 문제를 해결하는 가장 좋은 방법은 프록시가 다른 도메인의 서비스를 가리 않도록 때문에하지 백 엔드에서 백엔드에 자신의 프록시를 만드는 것입니다 동일한 원산지 정책 제한이 존재합니다. 다음 코드에 도시 ​​된 바와 같이

그러나, 당신은 할 수 없어 가정, 가장 쉬운 방법은, CORS Anywhere proxy 사용하는 것이다 (결과를 통해 오는 동안 소요 참고) :

이 도움이

$.ajaxPrefilter(function(options) { 
 
    if (options.crossDomain && jQuery.support.cors) { 
 
    var http = (window.location.protocol === 'http:' ? 'http:' : 'https:'); 
 
    options.url = http + '//cors-anywhere.herokuapp.com/' + options.url; 
 
    //options.url = "http://cors.corsproxy.io/url=" + options.url; 
 
    } 
 
}); 
 

 
$.get(
 
    'http://stackoverflow.com/feeds/question/10943544', 
 
    function(response) { 
 
    console.log("> ", response); 
 
    $("#viewer").html(response); 
 
    } 
 
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

희망! :)

+0

이것이 왜 아래 표의 자격이 필요한지 모르겠습니까? 답변을 향상시키기 위해 알고 싶습니다. –

+1

나는 그 질문에 답하는 것이 충분히 명확하지 않다고 생각한다. * "제 질문은 : ** 어떻게 읽을 수있는 오류를 얻을 수 있습니까? **"* readystate가 0이 될 것이라고 언급했지만, 어떻게 그 코드로 변환합니까? 그 밖의 결과로 textstatus가 0이 될 수 있습니까? 내 말은 사실은 오류가 발생하는 이유 때문에 실제 오류 메시지가 자바 스크립트를 통해 액세스 할 수 없다는 것입니다. –

+0

페이지가 요청을 완료 할 준비가되지 않은 상황 (예 : 잘못된 요청 또는 실패한 요청)에서'readyState'가 '0'으로 표시됩니다. 만약 당신이 요청을 만들 수 없다면, 오류가 발생 될 수 없기 때문에 ** errorThrown (또는 요청을 완전히 다시 만드는 것) 밖에서 알고있는 오류를 얻을 방법이 ** 없습니다 ** . 이 문제를 해결하기위한 답변을 업데이트했습니다. –