【问题标题】:Node.js server.address().address returns ::Node.js server.address().address 返回 ::
【发布时间】:2016-02-24 12:50:52
【问题描述】:

如果我没记错的话,几天前它曾经显示“localhost”。我不确定是什么改变了 server.address().address 返回双冒号 (::) 。 我在这里读到,如果它可用,它会返回一个 IPv6 地址 (::),但它在我的 PC 上被禁用。 https://nodejs.org/api/http.html#http_server_listen_port_hostname_backlog_callback

【问题讨论】:

  • 我成功实现的一个 hack:var host = server.address().address;主机=(主机=='::')? '本地主机':主机;

标签: javascript node.js express ipv6


【解决方案1】:

正如文档所说,

开始接受指定端口和主机名上的连接。如果省略主机名,当 IPv6 可用时,服务器将接受任何 IPv6 地址 (::) 上的连接,否则接受任何 IPv4 地址 (0.0.0.0) 上的连接。端口值为零将分配一个随机端口。

因此,以下代码将打印running at http://:::3456

var express      = require('express');
var app          = express();
var server = app.listen(3456, function () {
    var host = server.address().address;
    var port = server.address().port;
    console.log('running at http://' + host + ':' + port)
});

但是如果你添加一个明确的主机名:

var server = app.listen(3456, "127.0.0.1", function () {

它会打印你想看到的内容:running at http://127.0.0.1:3456

另外,您可能希望使用some IP lib 中指出的this answer

【讨论】:

  • URL 中的 IPv6 文字应该用方括号括起来,例如http://[::]:3456
  • 谢谢你我现在明白了。我仍然不明白的是,即使我的机器上禁用了 IPv6,为什么它选择 IPv6 而不是 IPv4?
  • @Jake 我不确定是否要禁用 IPv6m,但这也发生在旧节点版本中(尤其是 0.12)
  • @Jake 您很可能实际上并未在您的机器上禁用 IPv6。例如,从 Windows Vista/2008 开始,在 Windows 上几乎不可能这样做,并且成功地这样做会严重破坏系统,Microsoft 将不支持它,并且只会告诉您重新启用 IPv6 或重新安装 Windows。
  • 方括号也适用于127.0.0.1。例如:http://[${address}]:${port}
【解决方案2】:

它选择IPV6地址的原因可能是因为其他一些进程正在使用IPV4端口号3456。 这有时是由于安装了新进程的自动更新而发生的。

【讨论】:

  • IP,既不是 IPv4 也不是 IPv6,有端口号。端口号是一些 传输协议(UDP 和TCP)的传输地址。其他传输协议使用其他地址或不使用地址。 IP 当然有 IP 地址。
猜你喜欢
  • 1970-01-01
  • 2012-03-25
  • 2013-08-18
  • 2017-12-27
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 1970-01-01
  • 2020-07-11
相关资源
最近更新 更多