如何处理JavaScript Fetch错误?

时间:2016-09-08 14:42:28

标签: javascript google-chrome exception fetch-api

如果Chrome中的fetch来电失败,那么我收到的唯一错误详情就是

  

TypeError:无法获取

在这种情况下,如何向最终用户显示信息性错误消息?

具体做法是:

是否可以获取有关提取失败原因的详细信息?

例如,如果服务器崩溃,Chrome DevTools可能会记录net:ERR_EMPTY_RESPONSE的控制台消息,但似乎无法从JavaScript访问它。

据我所知,答案是否定的;我认为这是出于安全原因,以避免让恶意JS通过检查错误消息找出哪些网站是无法访问的。

是否可以区分其他TypeError的抓取错误?

如果我无法获得错误详情,我想至少取代可怕的模糊"无法取得"提供信息"无法访问该网站;请稍后重试"消息,我希望这样做,而不会有任何显示其他TypeError消息的风险。

我在此处找到的唯一解决方案是检查实际的message以查看它是否为"Failed to fetch"。这显然是特定于浏览器的;它可以在Chrome中运行,看起来它可以在Chrome的任何用户语言中运行,而其他浏览器则需要自己的测试和处理。

1 个答案:

答案 0 :(得分:9)

似乎没有关于网络/许可/输入问题的更多细节。

  

是否可以将fetch错误与其他TypeErrors区分开来?

是的,您只需要catch fetch来自fetch(…) .catch(err => new FetchError(err)) .… class FetchError extends Error { constructor(orig) { super(); this.message = "fetch error"; this.details = orig; } } 来自的错误:

(function (APP) {
  var ctx;
  APP.setContext = function (val) {
    // protect rogue JS from setting the context.
    if (ctx) {
      return;
    }
    val = val || val.trim();
    // Don't allow a double slash for a context.
    if (val.charAt(0) === '/' && val.charAt(1) === '/') {
      return;
    }
    // Context must both start and end in /.
    if (val.length === 0 || val === '/') {
      val = '/';
    } else {
      if (val.charAt(0) !== '/') {
        val = '/' + val;
      }
      if (val.slice(-1) !== '/') {
        val += '/';
      }
    }
    ctx = val;
  };
  APP.getContext = function () {
    return ctx || '/';
  };
  APP.getUrl = function (val) {
    if (val && val.length > 0) {
      return APP.getContext() + (val.charAt(0) === '/' ? val.substring(1) : val);
    }
    return APP.getContext();
  };
})(window.APP = window.APP || {});