2017-10-05 6 views
-1

Ich versuche, eine Remote-Datei zu lesen; Ich verwende the example on the jquery.get() documentation page:So lesen Sie eine Remote-Datei mit JQuery (und erhalten einen jqXHR lesbaren Fehler)

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>

Aber es löst nur „nicht bestanden“ und „immer“ und ich möchte verstehen, warum; Meine Frage ist: Wie kann ich einen lesbaren Fehler erhalten? Derzeit liefert die console.log("Error: (" + errorThrown + ')'); nur Error:().

Bonusfrage: Warum schlägt es fehl? Wie kann ich eine Remote-Datei (RSS) mit JS/JQuery lesen?

+0

'textStatus' <- Hast du das gesehen? – epascarello

+1

Es hängt vom Fehler ab. Nicht alle Fehlerinformationen sind bis zum Erreichen Ihres Codes lesbar. –

Antwort

1

Ihr Problem ist eines der Same Origin Policy, die auf den meisten AJAX-Anfragen vorhanden ist, und als Sicherheitsmaßnahme eingerichtet. Wenn Sie jqXHR() betrachten, können Sie sehen, dass readyState0 ist, das anzeigend. Beachten Sie, dass readyState immer 0 ist, wenn die Anforderung fehlgeschlagen ist, sei es für eine Richtlinieneinschränkung oder eine ungültige Anforderung. Die Nachricht error ist leer, da die Einschränkungen verhindern, dass die Fehlermeldung selbst ausgelöst wird.

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>

Um dies zu umgehen, gibt es eine Reihe von Plug-Ins, die in this answer aufgeführt sind. Es gibt auch an:

Der beste Weg, um dieses Problem zu überwinden, ist durch Erstellen eines eigenen Proxy im Back-End, so dass Ihr Proxy auf die Dienste in anderen Domänen zeigen, weil im Back-End nicht besteht die gleiche Herkunft Politikbeschränkung.

jedoch vorausgesetzt, Sie das nicht tun können, ist die einfachste Art und Weise Gebrauch von CORS Anywhere proxy zu machen, wie im folgenden Ausschnitt gezeigt wird (beachten Sie, dass das Ergebnis eine Weile dauert, durch kommen):

$.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>

hoffe, das hilft! :)

+0

Siehst du nicht wirklich, warum das eine Down-Vote verdient? Keen zu wissen, um die Antwort zu verbessern. –

+1

Ich denke nicht, dass es bei der Beantwortung der Frage klar genug ist. * "Meine Frage ist: ** Wie kann ich einen lesbaren Fehler erhalten? **" * Sie haben erwähnt, dass der Bereitschaftszustand 0 wäre, aber wie übersetzt sich das in den gegebenen Code? was sonst könnte einen Textstatus von 0 ergeben? Ich meine, neben der Tatsache, dass die eigentliche Fehlermeldung aufgrund Javascript ist genau aus dem Grund, dass ein Fehler auftritt. –

+0

Nun, Sie würden einen 'readyState' von' 0' in jeder Situation bekommen, in der die Seite nicht fertig ist, um die Anfrage zu vervollständigen, wie zum Beispiel eine fehlerhafte oder fehlgeschlagene Anfrage. Wenn Sie die Anfrage nicht machen können, gibt es ** keine ** Möglichkeit, den Fehler, der mir außerhalb von 'errorThrown' bekannt ist, zu bekommen (oder die Anfrage komplett neu zu erstellen), da der Fehler nicht ausgelöst werden kann . Ich habe die Antwort aktualisiert, um dies zu erfassen. –

Verwandte Themen