2017-10-05 109 views
-1

我試圖讀取遠程文件;我使用the example on the jquery.get() documentation page如何用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>

但只觸發「失敗」和「總是」,我想知道爲什麼;我的問題是:如何獲得可讀的錯誤?目前,console.log("Error: (" + errorThrown + ')');只產生Error:()

獎勵問題:爲什麼會失敗?如何使用JS/JQuery讀取遠程(RSS)文件?

+0

'textStatus' < - 你看過嗎? – epascarello

+1

這取決於錯誤。並非所有的錯誤信息在到達您的代碼時都是可讀的。 –

回答

1

您的問題是Same Origin Policy之一,它存在於大多數AJAX請求中,並作爲安全措施。如果你看看jqXHR(),你可以看到readyState0,表明這一點。請注意,當請求失敗時,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,但是,如何轉換爲給定的代碼?還有什麼可能導致0的textstatus?我的意思是,除了實際的錯誤信息是無法通過JavaScript訪問的事實,由於錯誤發生的原因。 –

+0

那麼在頁面沒有準備好完成請求的任何情況下,例如格式錯誤或失敗的請求,您都將獲得'readyState'。如果你不能提出請求,那麼**沒有**方法來獲得我在'errorThrown'之外發現的錯誤(或者完全重新構建請求),因爲錯誤不能被觸發。我已經更新了這個答案。 –