Javascript XMLHttpRequest()&;net::错误\u名称\u未\u解析

Javascript XMLHttpRequest()&;net::错误\u名称\u未\u解析,javascript,dns,xmlhttprequest,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

我正在编写一个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)能够找出发生了什么

如何获得错误名称未解决的指示

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

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


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

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

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

我关于Chromium bug reporter的报告和一位开发者的回复非常清楚地证明了这一点:尤其是评论#2

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

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

  • 将您的请求URL切换到
    http://127.0.0.1:3000
  • 使用新的请求URL发出网络请求
  • 切换回
    http://localhost:3000
  • 发出另一个网络请求,它应该可以工作

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

    Setting
    req.setRequestHeader('Access-Control-Allow-Origin',url)是无用的。我听说它很重要:你能说一下为什么它是无用的吗?谢谢你帮我理解这一点,因为服务器只能设置它。啊哈!是的,现在我明白了。非常感谢。作为记录,以下是CORS的工作原理:客户端/浏览器只发送请求。如果它指向另一个原点,则客户端/浏览器还包括“原点:…”标题。如果服务器想要接受请求,它将使用源服务器的“Access Control Allow Origin”头进行响应。浏览器还会在响应中检查该标头,如果该标头不存在,则会隐藏响应的所有标头信息。您可以检查
    req.status==0&&req.readyState==4
    。不幸的是,据我所知,没有办法找出它返回零状态的原因。这应该是正确的答案。解决了我的问题