【问题标题】:fetch API or XMLHTTPRequest: How to get exact error reason for a network error? [duplicate]获取 API 或 XMLHTTPRequest:如何获取网络错误的确切错误原因? [复制]
【发布时间】:2019-04-16 07:54:42
【问题描述】:

如何检索有关网络错误的确切信息? Chrome 浏览器会在控制台中打印诸如“net::ERR_CONNECTION_TIMED_OUT”或“net::ERR_CERT_INVALID”之类的内容,但是如何通过 JS 检索它们?有可能得到它们吗?目前我使用 fetch API,但我可以轻松切换到 XMLHTTPRequest。

我需要它来处理此类错误以通知用户并让他知道他需要做什么。

【问题讨论】:

  • 获取 API 使用承诺,因此您可以通过 .catch() 轻松获取错误。这就是你要找的东西?
  • 不。该错误不包含任何特定信息。它只是说“TypeError:无法获取”
  • 您要检查响应状态。例如,无效证书应该是 400 系列。查看wretch 包装器fetch()。将为您简化此操作
  • 我不想检查响应状态。我想检查“请求失败的原因”,其中失败的请求没有任何代码。
  • @charlietfl — 它不会是 400,因为它会在 TLS 级别而不是 HTTP 级别出错。

标签: javascript xmlhttprequest fetch


【解决方案1】:

你可以得到如下确切的错误:

     fetch('url',
        {
            headers: {
                'Accept': 'application/json',
                'Content-Type': 'application/json'
            },
            method: "POST",
            body: JSON.stringify({data})
        })
        .then(function(response) {
            console.log(response);
            //handle here or in catch
         })
        .then(function(json){
            console.log("succeed json re");
        });

一旦您的承诺得到解决,您将获得已解决的响应。

Response.status 会给你状态码。 Response.statusText 将为您提供准确的错误描述,如 ERR_CONNECTION_TIMED_OUT。这将是在发生错误的情况下,然后 response.ok 将是错误的。

欲了解更多信息:FETCH

【讨论】:

  • "Response.statusText — 一个字符串(默认值“OK”),对应于 HTTP 状态代码消息。" 1.据我所知,ERR_CONNECTION_TIMED_OUT 没有任何状态码。 2. ERR_CONNECTION_TIMED_OUT 发生时,fetch API 会抛出错误,这意味着无法获取 Response 实例并读取 statusText 属性。
【解决方案2】:

为了防止安全问题,故意无法从 JavaScript 访问此信息。

这是 2017 年 5 月要求提供此功能的 Chromium 错误报告:https://bugs.chromium.org/p/chromium/issues/detail?id=718447

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多