【问题标题】:XMLHttpRequest() & net::ERR_NAME_NOT_RESOLVEDXMLHttpRequest() & net::ERR_NAME_NOT_RESOLVED
【发布时间】:2016-02-07 18:19:19
【问题描述】:

我正在编写一个向远程服务器发出 HTTP 请求的 javascript 应用程序。用户将输入主机名。

如果他们输入的 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,response 是 "",所以没有太多迹象表明出了什么问题。然而,控制台显示“加载资源失败:net::ERR_NAME_NOT_RESOLVED”,因此浏览器 (Chrome) 能够弄清楚发生了什么。

如何获得 ERR_NAME_NOT_RESOLVED 的指示?

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

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

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

【问题讨论】:

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

标签: javascript dns xmlhttprequest


【解决方案1】:

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

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

我对 Chromium 错误报告者的报告和其中一位开发人员的回复非常清楚地证实了这一点,https://bugs.chromium.org/p/chromium/issues/detail?id=718447 尤其是评论 #2。

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 这应该是正确的答案。解决了我的问题
    • 这如何为脚本提供任何信息,发生了什么类型的错误?
    猜你喜欢
    • 1970-01-01
    • 2020-08-28
    • 2021-06-21
    • 2018-04-28
    • 1970-01-01
    • 2011-02-08
    • 2021-06-05
    • 1970-01-01
    • 2015-10-06
    相关资源
    最近更新 更多