- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 node.js 16.13.1 (Windows) 下,这样的代码有效(假设服务器存在并且工作正常):
import net from 'net';
let socket = net.createConnection({
host: 'localhost',
port: 12345
})
更新到 node.js 17.7.2 后,上面现在抛出 ECONNREFUSED(连接被拒绝)错误。但是,它适用于“0.0.0.0”而不是“localhost”。
事实上,即使记录在案的默认“localhost”(感谢 VLAZ)在 17.7.2 上也会失败:
// connects with 16.13.1, ECONNREFUSED with 17.7.2:
net.createConnection({port:12345});
// connects with both versions:
net.createConnection({port:12345,host:'0.0.0.0'});
// connects with 16.13.1, ECONNREFUSED with 17.7.2:
net.createConnection({port:12345,host:'localhost'});
我已经确认该行为取决于 Node 的版本。我可以通过切换 Node 版本、使用任何建立网络连接的代码来可靠地避免/重现该行为。
我有相当多的主机默认为“localhost”的代码。如果不需要,我宁愿不将所有这些更新为“0.0.0.0”。更乏味的是,用户通常会提供主机地址并期望“localhost”能够工作,所以现在我每次创建一个带有用户指定主机地址的套接字时都必须添加将“localhost”转换为“0.0.0.0”的逻辑.我的意思是,我会做我必须做的事,但这种做法很糟糕。
我的问题是:16.13.1 和 17.7.2 之间发生了什么导致“localhost”不再可用?这是一个错误,还是一些有意的改变?而且,有没有办法让它再次工作,或者我现在必须到处查找并用“0.0.0.0”替换“localhost”?
我怀疑人们在互联网上询问的很多“连接被拒绝到本地主机”错误都与任何更改有关...
更新:这似乎与 17 中接口(interface)枚举方式(或类似方式)的变化有关,而不是“localhost”的具体使用。
例如,使用以下测试设置:
然后是 16.13.1:
但是对于 17.7.2:
现在是用 Node 创建的服务器;服务器和客户端的 Node 版本也相同。在我原来的情况下,我的服务器是用 C++ 和标准 socket()
创建的API,绑定(bind)到 INADDR_ANY
(0.0.0.0).
测试代码:
import net from 'net';
console.log(process.version);
const accepted = detail => socket => socket.write(detail, ()=>socket.end());
const serversReady = () => [
new Promise(resolve => net.createServer(accepted('default')).listen(12345, function(){resolve(this)})),
new Promise(resolve => net.createServer(accepted('localhost')).listen(12346, 'localhost', function(){resolve(this)})),
new Promise(resolve => net.createServer(accepted('0.0.0.0')).listen(12347, '0.0.0.0', function(){resolve(this)}))
];
const ports = [[12345,'default'], [12346,'localhost'], [12347,'0.0.0.0']];
const hosts = [{}, {host:'localhost'}, {host:'0.0.0.0'}];
const clientsDone = () => ports.map(([port,whichserver]) => hosts.map(host => new Promise((resolve, reject) => {
let opts = {...host, port:port};
net.createConnection(opts)
.on('error', e => (console.log(opts, 'to:'+whichserver, 'error', e.message), reject(e)))
.on('data', d => console.log(opts, 'to:'+whichserver, 'read', d.toString()))
.on('end', () => resolve());
}))).flat();
Promise.all(serversReady())
.then(servers => Promise.allSettled(clientsDone()).then(() => servers))
.then(servers => servers.forEach(s => s.close()));
下类后会有更多相关信息,但我想我会尽早发布这一点。也会检查 18。
最佳答案
我引用来自 @richardlau 的答案
Node.js no longer re-sorts results of IP address lookups and returnsthem as-is (i.e. it no longer ignores how your OS has beenconfigured). You can change the behaviour via the verbatim option todns.lookup() or set the --dns-result-order command line option tochange the default.
您可以 ping 本地主机。如果显示:
Reply from 127.0.0.1
这意味着您的系统更喜欢 ipv4 地址来解析本地主机。如果显示:
Reply from ::1
这意味着您的系统更喜欢 ipv6 地址。
你可以 change system setting to prefer ipv4 . Node.js 将按照您的预期将 localhost 解析为 127.0.0.1。
关于javascript - Node.js 16 -> 17 更改了 "localhost"的分辨率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72648487/
谁能解释一下 localhost:5000 之间的区别和其他本地主机。 谢谢你。 最佳答案 localhost:5000 正在访问端口 5000 上的 localhost。 例如,如果您从浏览器访问它
假设本地 Python 脚本正在运行网络服务器。 有没有办法设置别名,以便http://localwebapp/等于 http://localhost:1234/ ? 编辑:或至少 http://lo
我对网络开发完全陌生。所以我总是看到“localhost”之类的东西并问自己:那是什么? 我感觉知道什么是“主持人”了。执行某事的东西。所以我的 Mac 是其上运行的所有内容的主机。那么“localh
我正在学习 xmpp 编程,我使用 sudo apt-get install ejabberd 在我的 ubuntu 15.10 上安装了 ejabberd,然后我通过添加管理员用户 ejabberd
是否总是可以 ping localhost 并解析为 127.0.0.1? 我知道 Windows Vista、XP、Ubuntu 和 Debian 都这样做,但每个人都这样做吗? 最佳答案 任何正确
我们在同一台计算机上使用客户端/服务器 RMI 通信(因此所有 ip 都应该是本地主机)。 我们启动注册表(使用默认端口1099) registry = LocateRegistry.createRe
我已经在 windows/system32/drivers/etc/ 中验证了我的主机文件其中有一个 localhost 的条目,但它不会去任何地方。我必须在 URL 中有一个端口号:http://1
我的主机上有一个守护程序在某个端口(即 8008)上运行,我的代码通常通过联系 localhost:8008 与守护程序交互。 我现在已经将我的代码容器化了,但还没有将守护进程容器化。如何将容器上的
在 SMTP 中,HELO 命令之后应该是什么,它有什么作用? 我在我的应用程序中发送电子邮件,我想知道我是否应该使用 localhost、发件人地址的域名 (me@example.com)、应用程序
我遇到无法打开本地主机Web应用程序的问题,因为Microsoft Edge会将URL http://localhost:3000重定向到https://localhost:3000。因此,我得到了错
一直在尝试设置我想用于登录的 Facebook 应用程序,以允许我在 Mac 的本地主机上测试它。 Facebook 抛出错误“应用程序域:http://localhost 不是有效域。”当我尝试将站
我在 MacOS 10.15 上使用 minikube 1.4.0 版和 Kubernetes 1.16.0 版。 我正在开发一些依赖于外部服务的授权/认证代码。在对服务的 API 调用中,我需要提供
当我用谷歌搜索这个问题时,我注意到这是 nginx 的一个常见问题。但是我从来没有在我的机器上使用过 nginx。我使用 MAMP,偶尔使用 Python Bottle。 现在,无论我的 MAMP/P
我在本地运行 Squid,我想通过在 localhost:3000 上运行的 Ruby 服务器通过 Squid 进行访问。 如果我尝试访问 localhost:3000,我会收到以下消息: The f
我使用 VS 2012 默认模板创建了 MVC4 移动应用程序。使用 http://localhost/mvcapplication1/ 在桌面浏览器中运行良好但是当我尝试在 WP8 Emulator
如何将默认的 xampp localhost c:xampp/htdoc 更改为另一个文件夹,即 c:/alan?当我使用 IP 地址时,我应该能够在 C:/alan 中查看我的网站文件。 感谢您帮助
我正在使用带有centos版本6(Fedora)的Vmware。我正在使用hadoop 1.0.4版本。我的 http://localhost:50070 地址显示为“无法连接”,但是 http://
我正在运行带有 apache 2.4.38 和 Maria DB 10.1.38 + PHP 7.3.3 的 Windows Server 2016 有时,我可以看到(使用 netstat)从 127
尝试通过 SSH 连接到本地主机时的调试信息 ssh root@localhost -vvv 输出 OpenSSH_6.6.1、OpenSSL 1.0.1f 2014 年 1 月 6 日debug1:
我正在使用 Node 和 Laravel 编写一个应用程序。我正在运行小型 laravel 本地服务器,该服务器解析为 http://localhost:8000 。我还在 localhost:300
我是一名优秀的程序员,十分优秀!