我正在编写一个javascript应用程序,它发出远程服务器的HTTP请求。用户将输入主机名。
如果他们输入无法解析的DNS名称,我想提供诊断消息。这是当前的代码:
var req, t, url;
url = 'http://definitelydoesntexist0x314159.com';
req = new XMLHttpRequest();
req.open('GET', url, true);
req.onreadystatechange = function() {
if (req.readyState == 4) {
t = req.statusText;
}
};
req.send();
在onreadystatechange函数中,req的status = 0,响应为“”,因此没有太多迹象表明出了什么问题。然而,控制台显示“无法加载资源:net :: ERR_NAME_NOT_RESOLVED”,因此浏览器(Chrome)能够弄清楚发生了什么。
如何获得ERR_NAME_NOT_RESOLVED的指示?
更新:我回到了这个问题,使用的策略是任何不是“超时”的响应意味着名称已解析,主机回答等等。
原始问题的答案似乎是:浏览器本身(在本例中为Chrome)检测到无法解析并在控制台中显示它,但XMLHttpRequest API不够丰富,无法指示原因。因此,可怜的Javascript程序员会将超时作为一种解决方法。
我还删除了CORS标题,因为正确记录的评论者之一没有任何价值。
答案 0 :(得分:5)
经过大量的研究后,我更清楚地理解了问题,并理解了答案(不,这是不可能的 - 例如,ERR_NAME_NOT_RESOLVED - 在错误状态下)。
这是设计。 Javascript错误处理例程不会,也不能返回有关失败原因的更多信息。浏览器这样做是为了防止恶意Javascript代码在本地网络上运行端口扫描程序并将该信息发送到远程服务器。
我的关于Chromium bug记者的报告以及其中一位开发人员的回复非常明确地证实了这一点:https://bugs.chromium.org/p/chromium/issues/detail?id=718447特别是评论#2。
因此,窗口中的javascript运行在只能访问的沙箱中 加载,超时,中止和错误状态,没有任何进一步的粒度。 (浏览器的调试环境,可以显示此信息,因此您可以找出问题所在......)
答案 1 :(得分:0)
今天早晨,当我尝试访问本地计算机上运行的服务器时遇到了这个问题,我可以通过执行以下操作来解决它。
http://127.0.0.1:3000
http://localhost:3000
我认为它通过强迫它直接使用IP地址来清除一些缓存。希望它对遇到此问题的其他人有用。