javascript - 使用 XMLHttpRequest 时如何向用户显示实际的网络错误?

标签 javascript ajax xmlhttprequest

如果尝试进行 Ajax/XMLHttpRequest 调用时发生了某种网络类型错误,则 XMLHttpRequest.status 通常只是“0”。但肯定应该有一种方法可以准确地告诉用户网络错误是什么,例如是 DNS 解析失败,还是连接被主动拒绝,甚至是连接建立但在发送任何有效的 HTTP 响应之前中止? IE。至少在 JavaScript 控制台中打印出一些额外的信息,例如

SCRIPT7002:XMLHttpRequest:网络错误 0x2efd,由于错误 00002efd,无法完成操作。

但这不是很友好,我看不出如何从 javascript 查询该信息以将其转换成我可以向用户显示的内容。

我不介意它是否必须针对不同的浏览器以不同的方式实现,但我目前正在努力寻找获取此信息的任何方式。

顺便说一句,至少我希望能够区分:

  • a) 没有互联网连接(例如 wifi 断开连接)
  • b) DNS 故障(无法解析名称)
  • c) 无法与服务器建立 TCP 连接(主动拒绝或超时)
  • d) 无效响应(不是 HTTP 响应)
  • e) SSL 证书失败

在返回有效 HTTP 响应但不是状态 200 OK 的任何情况下,都没有问题 - 我可以获得一条合理的错误消息以显示给用户。但是对于其他任何事情,似乎都没有办法区分各种可能的错误类型。在我的应用程序中,用户负责提供向其发出 Ajax 请求的地址,因此如果他们弄错了,我希望能够告诉他们请求失败的原因。

最佳答案

处理 XHRonerror 在这里可以帮助您了解出错的实际细节;您也可以尝试 ontimeout 处理程序来专门捕获它是否超时;并且正如@dandavis 在 XHR 之前提到的,您还可以检查 navigator.onLine 以避免在调用 XHR 之前出现任何无网络情况。 这里有一个简单的 stub :

function makeRequest() {
    if(navigator.onLine){
    let xhr = new XMLHttpRequest();
    xhr.open('GET', 'someurl/somepage', true);
    xhr.timeout = 2000;
    xhr.onload = function () {
        // Your request is completed
        if (xhr.readyState == 4 && xhr.status == 200) {
            //successful
        }
    };
    x.onerror= function(e) {
    //Error occured, e will give you more information
    };
    xhr.ontimeout = function (e) {
        // Your request timed out
    };
    xhr.send(null);
  }
  else{
    alert('No network connection');
  }
}

关于javascript - 使用 XMLHttpRequest 时如何向用户显示实际的网络错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29111969/

相关文章:

javascript - Angular : reload page after redirection

javascript - 禁用 Mozilla Firefox 任务栏上的绿色下载通知进度条

javascript - IF-ELSE 语句不起作用

javascript - 每次单击 loadmore 按钮时,如何将 getJSON 的结果附加到 div 中?

javascript - 如何同时使用 if 和 while Javascript 设置 3 个条件

javascript - 外部脚本未在移动设备上加载 : Uncaught TypeError

javascript - 在 React 中使用 AJAX 获取服务器数据

javascript - 如何获取 <opensearch :totalResults> from an xml doc tag in Javascript? 的值

json - 动态 365 CRM : Sudden JS Error

javascript - forEach 函数中的 Http 请求。 Angular 2