繁体   English   中英

XMLHttpRequest()和net :: ERR_NAME_NOT_RESOLVED

[英]XMLHttpRequest() & net::ERR_NAME_NOT_RESOLVED

我正在编写一个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的状态为= 0,响应为“”,因此没有太多迹象表明发生了什么错误。 但是控制台显示“无法加载资源:net :: ERR_NAME_NOT_RESOLVED”,因此浏览器(Chrome)能够确定发生了什么。

如何获得ERR_NAME_NOT_RESOLVED的指示?

更新:我回到了这个问题,使用了这样的策略,即任何不是“超时”的响应都意味着名称已解析,主机答复等。

我的原始问题的答案似乎是:浏览器本身(在本例中为Chrome)检测到无法解决的故障,并将其显示在控制台中,但是XMLHttpRequest API不够丰富,无法指出原因。 因此,可怜的Javascript程序员只能将超时作为解决方法。

我还删除了CORS标头,因为正确指出的其中一位评论者没有任何价值。

经过大量的研究,我更清楚地了解了问题,并找到了答案(不,不可能找到错误状态的原因,例如ERR_NAME_NOT_RESOLVED)。

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

我关于Chromium错误报告程序的报告以及其中一位开发人员的回应非常清楚地证明了这一点, 网址为: https : //bugs.chromium.org/p/chromium/issues/detail?id=718447,尤其是评论2 。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM