【问题标题】:How to read a remote file with JQuery (and get a jqXHR readable error)如何使用 JQuery 读取远程文件(并获得 jqXHR 可读错误)
【发布时间】:2017-10-06 03:48:55
【问题描述】:

我正在尝试读取远程文件;我正在使用the example on the jquery.get() documentation page

    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) 文件?

【问题讨论】:

  • textStatus
  • 这取决于错误。并非所有错误信息在到达您的代码时都是可读的。

标签: javascript jquery jqxhr


【解决方案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,如下面的 sn-p 所示(注意结果需要一段时间过来):

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

希望这会有所帮助! :)

【讨论】:

  • 真的不明白为什么这值得一票否决?渴望知道以改进答案。
  • 我认为回答这个问题不够清楚。 “我的问题是:我怎样才能得到一个可读的错误? 你确实提到了 readystate 会是 0,但是,它如何转化为给定的代码呢?还有什么可能导致 textstatus 为 0?我的意思是,除了由于发生错误的原因,实际的错误消息无法通过 javascript 访问之外。
  • 那么,在页面尚未准备好完成请求的任何情况下,例如格式错误或失败的请求,您都会得到readyState0。如果您无法提出请求,则 没有 方法可以在 errorThrown 之外获取我所知道的错误(或完全重新制作请求),因为错误可以'不会被触发。我已经更新了答案以涵盖这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-06
  • 1970-01-01
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
  • 2012-07-19
相关资源
最近更新 更多