Expressjs服务器地址主机返回空值。

13

按照标准的ExpressJs hello word示例,我得到了一堆 ' : : '。

为什么会发生这种情况?

hello word示例:

var server = app.listen(3000, function () {
  var host = server.address().address;
  var port = server.address().port;

  console.log('Example app listening at http://%s:%s', host, port);
});

我发现了一个提示,即在端口参数后面添加“localhost”。 当我只查看我的计算机时,它解决了问题,但是在网络上不起作用。 我该怎么办?


你是否尝试过从文档中获取信息?http://expressjs.com/starter/hello-world.html - BrTkCa
@LucasCosta 是的,我做了。 - KpsLok
我遇到了完全相同的问题。 - Bagusflyer
1
你已经找到解决方案了吗?我敢肯定几天前它还能正常工作... - Jake
@Jake 对不起,很久没有回复你了!不,我还没有! - KpsLok
3个回答

11

对于这段代码

var server = app.listen(3000, function () {

listen 函数中没有指定地址参数,Node 会将它绑定到 任何地址,与 IPV4 的地址 0.0.0.0 相关,对应于 IPV6 中的 ::。而这个 IPV6 未指定地址,0:0:0:0:0:0:0:0,被缩写为 ::

运行 netstat -a 后。

 TCP    [::]:3000              CP-Q10001:0       LISTENING

我们知道节点服务器在地址::上监听端口3000


参考express.js此处使用的http.listen,请参考此处

app.listen = function listen() {
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
};
如果省略了主机名,当IPv6可用时,服务器将接受任何IPv6地址(::)的连接;否则将接受任何IPv4地址(0.0.0.0)的连接。

但为什么它返回空白呢?难道不应该是某种IP地址吗? - George Mauer
@GeorgeMauer,结果是 http://:::3000,其中的 ::IPV6 的 IP 地址,不是空白。 - zangw
过去,它可以正常显示 http://127.0.0.1:3000,但是几天后就停止了,再也没有显示出来了 :( - KpsLok
@GeorgeMauer,node.js的http.listen文档解释了::用于启用IPV6。 - zangw
@BrennoLeal 相关部分似乎在这里:(https://nodejs.org/api/http.html#http_server_listen_port_hostname_backlog_callback) :“如果省略主机名,那么在IPv6可用时服务器将接受任何IPv6地址(::),否则接受任何IPv4地址(0.0.0.0)。端口值为零将分配一个随机端口。” - George Mauer

10

我尝试了示例代码,输出结果中的主机名为“::”。我进行了以下更改以解决问题:

 var server = app.listen(3000, 'localhost', function () {
     var host = server.address().address;
     var port = server.address().port;
     console.log('Example app listening at http://%s:%s', host, port);
});

输出:

示例应用程序在 http://127.0.0.1:3000 上监听。


是的,我已经尝试过了,但它在网络上不可用。你有没有尝试用另一台电脑/智能手机/平板电脑访问机器IP? - KpsLok
在我的例子中,我将本地主机设置为地址,所以如果你需要使它对网络可用,可以尝试将你的计算机IP地址设置为地址并尝试一下? - lsampaio
我在来这里之前已经做过了...它运行良好,但是以前的ExpressJS会自动给我们提供网络地址。 - KpsLok

1
这将为您提供所需的结果。您不需要包含“localhost”。
var server = app.listen(3000, function () {
    var port = server.address().port;
    require('dns').lookup(require('os').hostname(), function (err, add, fam) {
        debug('Example app listening at http://%s:%s', add, port);
    })
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接