XMLHttpRequest()&网:: ERR_NAME_NOT_RESOLVED

时间:2015-11-06 14:57:02

标签: javascript dns xmlhttprequest

我正在编写一个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标题,因为正确记录的评论者之一没有任何价值。

2 个答案:

答案 0 :(得分:5)

经过大量的研究后,我更清楚地理解了问题,并理解了答案(不,这是不可能的 - 例如,ERR_NAME_NOT_RESOLVED - 在错误状态下)。

这是设计。 Javascript错误处理例程不会,也不能返回有关失败原因的更多信息。浏览器这样做是为了防止恶意Javascript代码在本地网络上运行端口扫描程序并将该信息发送到远程服务器。

我的关于Chromium bug记者的报告以及其中一位开发人员的回复非常明确地证实了这一点:https://bugs.chromium.org/p/chromium/issues/detail?id=718447特别是评论#2。

因此,窗口中的javascript运行在只能访问的沙箱中 加载,超时,中止和错误状态,没有任何进一步的粒度。 (浏览器的调试环境,可以显示此信息,因此您可以找出问题所在......)

答案 1 :(得分:0)

今天早晨,当我尝试访问本地计算机上运行的服务器时遇到了这个问题,我可以通过执行以下操作来解决它。

  1. 将您的请求网址切换为http://127.0.0.1:3000
  2. 使用新的请求网址进行网络请求
  3. 切换回http://localhost:3000
  4. 发出另一个网络请求,它应该可以工作

我认为它通过强迫它直接使用IP地址来清除一些缓存。希望它对遇到此问题的其他人有用。