javascript XMLHttpRequest() & net::ERR_NAME_NOT_RESOLVED

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/33569559/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-28 16:38:14  来源:igfitidea点击:

XMLHttpRequest() & net::ERR_NAME_NOT_RESOLVED

javascriptdnsxmlhttprequest

提问by richb-hanover

I am writing a javascript app that makes an HTTP request of a remote server. The user will enter the host name.

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

I want to offer a diagnostic message if they enter a DNS name that cannot resolve. Here's the current code:

如果他们输入无法解析的 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();

In the onreadystatechange function, the req has status=0, response is "", so there's not much indication of what went wrong. Yet the Console shows "Failed to load resource: net::ERR_NAME_NOT_RESOLVED" so the browser (Chrome) was able to figure out what happened.

在 onreadystatechange 函数中,req 的状态为 0,响应为“”,因此没有太多迹象表明出了什么问题。然而,控制台显示“无法加载资源:net::ERR_NAME_NOT_RESOLVED”,因此浏览器 (Chrome) 能够弄清楚发生了什么。

How can I get an indication of ERR_NAME_NOT_RESOLVED?

如何获得 ERR_NAME_NOT_RESOLVED 的指示?

Update:I have come back to this question, using the strategy that any response that isn't 'timeout' means that the name resolved, the host answers, etc.

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

The answer to my original question seems to be: It appears that the browser itself (Chrome, in this case) detects the failure to resolve and displays it in the Console, but the XMLHttpRequest API isn't rich enough to indicate the cause. So the poor Javascript programmer is stuck with the timeout as a workaround.

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

I also removed the CORS header, as one of the commenters correctly noted was of no value.

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

采纳答案by richb-hanover

After a great deal more research, I understand the problem more clearly, and understand the answer (No, it's not possible to get the reason - e.g., ERR_NAME_NOT_RESOLVED - in the error status).

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

This is by design.The Javascript error handling routines do not, and must not, return more information about the reason for the failures. Browsers do this to prevent malicious Javascript code from running port scanners on the local network and sending that information to a remote server.

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

This is borne out quite clearly by my report on the Chromium bug reporter and the response from one of the developers, at: https://bugs.chromium.org/p/chromium/issues/detail?id=718447especially Comment #2.

我对 Chromium 错误报告者的报告以及其中一位开发人员的回复清楚地证明了这一点,网址为:https: //bugs.chromium.org/p/chromium/issues/detail?id=718447特别是评论 #2 .

Thus, the javascript in the window runs in a sandbox, that only has access to load, timeout, abort, and error status, without any further granularity. (The browser's debugging environment, though, candisplay this information, so you can figure out what went wrong...)

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

回答by Nitsew

I had this issue this morning when I was trying to hit a server running on my local machine and I was able to resolve it by doing the following.

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

  1. Switch your request URL to http://127.0.0.1:3000
  2. Make a network request with the new request URL
  3. Switch back to http://localhost:3000
  4. Make another network request and it should work
  1. 将您的请求 URL 切换为 http://127.0.0.1:3000
  2. 使用新的请求 URL 发出网络请求
  3. 切换回 http://localhost:3000
  4. 发出另一个网络请求,它应该可以工作

I think it cleared some cache by forcing it to use the IP address directly. Hopefully, it works for others experiencing this issue.

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