Express应用程序服务器。监听所有接口而不仅仅是本地主机。

81

我对这方面非常陌生,正在尝试创建一些express应用程序

var express = require('express');
var app = express();

app.listen(3000, function(err) {
    if(err){
       console.log(err);
       } else {
       console.log("listen:3000");
    }
});

//something useful
app.get('*', function(req, res) {
  res.status(200).send('ok')
});

当我使用以下命令启动服务器:

When I start the server with the command:

node server.js 

一切都很顺利。

我在控制台上看到

listen:3000

当我尝试时

curl http://localhost:3000
我看到了“好的”。 当我尝试时。
telnet localhost

我明白了

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]' 

但是当我尝试时

netstat -na | grep :3000

我明白了

tcp  0  0 0.0.0.0:3000   0.0.0.0:*  LISTEN
问题是:为什么它会监听所有接口而不仅仅是本地主机?操作系统是没有任何特别设置的Linux Mint 17版本。

2
精细的手册指出:「如果省略主机名,当 IPv6 可用时,服务器将接受任何 IPv6 地址 (::),否则接受任何 IPv4 地址 (0.0.0.0)。」 - robertklep
1
谢谢。我认为这是“显式优于隐式(c)”的另一个标志。 - Pavel L
2
考虑到接受外部连接是服务器的基本前提,我认为监听所有接口(而不是回环)似乎是一个合理的默认设置 :-) - robertklep
3个回答

150
如果在调用app.listen时没有指定主机,服务器将在所有可用接口上运行,即在0.0.0.0上运行。 您可以使用以下代码绑定IP地址。
app.listen(3000, '127.0.0.1');

如果你想在所有接口上运行服务器,请使用以下代码

app.listen(3000, '0.0.0.0');
或者
app.listen(3000)

36

从官方文档看来: app.listen(port, [hostname], [backlog], [callback])

在特定的主机和端口绑定并监听连接。该方法与Node的http.Server.listen()完全相同。

var express = require('express');
var app = express();
app.listen(3000, '0.0.0.0');

在待办事项参数中应该提供什么? - Muhammad Awais
2
如果在使用TypeScript时出现“没有这样的重载”错误,请确保第一个参数确实是数字而不是字符串。通常我们将第一个参数传递为process.env.PORT,它实际上是字符串。将其更改为parseInt(process.env.PORT || '8080') - AppleGrew

17

文档: app.listen([port[, host[, backlog]]][, callback])

示例:

const express = require('express');
const app = express();
app.listen('9000','0.0.0.0',()=>{
      console.log("server is listening on 9000 port");
})
注意:在外部接口访问时,请使用0.0.0.0作为主机。

1
为什么你错过了待办事项参数?在我的端上,它会报错说“不存在这样的重载”。 - Muhammad Awais

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