53

我编写了一个小型 Node.js 应用程序,使用connect提供网页,然后定期向其发送更新。它还接受用户观察并将其记录到磁盘文件中。

只要我在本地主机上,它就可以正常工作,但我无法让同一 Intranet 上的其他计算机看到它。我正在使用端口 3000,但更改为端口 8080 或 80 并没有帮助。

这是我用来设置连接的代码:

var io = require('socket.io'),
  connect = require('connect');

var app = connect().use(connect.static('public')).listen(3000);
var chat_room = io.listen(app);

如上所述,我尝试将端口号更改为 8080 或 80,并没有看到任何区别,所以我认为这不是防火墙问题(但我可能是错的)。在阅读了处理 HTTP 的类似问题后,我还考虑过将 0.0.0.0 添加到listen()方法中,但似乎不需要listen()IP 掩码参数。

4

12 回答 12

115

很可能您的服务器套接字绑定到环回 IP 地址127.0.0.1而不是“所有 IP 地址”符号 IP 0.0.0.0(注意这不是网络掩码)。要确认这一点,请运行sudo netstat -ntlp(如果您使用的是 linux)或netstat -an -f inet -p tcp | grep LISTEN(OSX)并检查您的进程绑定到哪个 IP(查找带有“:3000”的行)。如果您看到“127.0.0.1”,那就是问题所在。通过将“0.0.0.0”传递给listen调用来修复它:

var app = connect().use(connect.static('public')).listen(3000, "0.0.0.0");
于 2012-12-26T19:21:34.143 回答
76

为了让其他用户访问您的本地机器,我通常使用ngrok。Ngrok 将你的 localhost 暴露给网络,并且有一个易于安装和启动的 NPM 包装器:

$ npm install ngrok -g
$ ngrok http 3000

请参阅此示例用法:

在此处输入图像描述

在上面的示例中,在本地运行的sails 实例:localhost:3000现在可以在 Internet 上使用:http: //69f8f0ee.ngrok.iohttps://69f8f0ee.ngrok.io

于 2016-01-07T15:56:37.083 回答
8

绑定到 0.0.0.0 是成功的一半。有一个 ip 防火墙(与系统首选项中的不同)阻止 TCP 端口。因此,端口也必须通过以下方式解除阻塞:

sudo ipfw add <PORT NUMBER> allow tcp from any to any
于 2013-06-04T15:36:17.180 回答
7

在您的应用上,使其可从网络中的任何设备访问:

app.listen(3000, "0.0.0.0");

适用于 Azure、GCP 和 AWS 中的 NodeJS

对于部署在资源管理器中的 Azure vm,请检查您的虚拟网络安全组并打开端口或端口范围以使其可访问,否则如果 vm 部署在旧版本的 azure 中,则在您的云端点中。

只需为 GCP 和 AWS 寻找等效的

于 2017-07-07T04:44:40.183 回答
6

对于这个问题,我有一个非常简单的解决方案:process.argv为您提供传递给节点应用程序的参数列表。因此,如果您运行:

node server.js 0.0.0.0

你会得到:

process.argv[0] //=> "node"
process.argv[1] //=> "server.js"
process.argv[2] //=> "0.0.0.0"

因此,您可以使用process.argv[2]将其指定为要收听的 IP 地址:

http.listen(3000, process.argv[2]);

现在,您的应用正在侦听“所有”IP 地址,例如http://192.168.1.4:3000/your_app

我希望这会对某人有所帮助!

于 2017-04-29T11:14:27.640 回答
1

FedoraCentos发行版检查您的 selinux 和 firewalld,在我的情况下,firewalld 阻止了连接:

Selinux:$sestatus
SELinux 状态:启用
SELinuxfs 挂载:/sys/fs/selinux
SELinux 根目录:/etc/selinux
加载的策略名称:targeted
当前模式:{{checkmode}}
配置文件中的模式:{{checkconfig}}
策略 MLS 状态:已启用
政策拒绝未知状态:允许
最大内核策略版本:30

防火墙状态:$systemctl status firewalld
于 2016-09-12T22:51:12.237 回答
1

就我而言,我必须同时使用符号 IP 地址“0.0.0.0”并在收听服务器 “cors”时回调:“^2.8.5”、 “express”:“^4.17.1”、

const cors = require("cors");
app.use(cors());

const port = process.env.PORT || 8000;
app.listen(port,"0.0.0.0" ,() => {
  console.log(`Server is running on port ${port}`);
});

您也可以使用您的本地 IP 地址而不是“0.0.0.0”,在 OS Ubuntu 中,您可以使用命令找到您的 IP 地址

ifconfig | grep "inet " | grep -v 127.0.0.1

在此处输入图像描述 然后使用IP地址:

app.listen(port,"192.168.0.131" ,() => {
  console.log(`Server is running on port ${port}`);
});

如果你使用固定的IP地址比如“192.168.0.131”,那么你必须在调用服务器的时候使用它,比如,我的react客户端的api调用配置如下:

REACT_APP_API_URL = http://192.168.0.131:8001/api
于 2020-11-14T00:27:49.407 回答
0

使用这条线为我工作(只需在运行时添加--listen):

node server.js -p 3000 -a : --listen 192.168.1.100

希望能帮助到你...

于 2017-05-24T08:33:12.293 回答
0

在解决这个问题很长一段时间后,我设法通过允许端口 8080 上的传入连接来解决它。

由于您写道该.listen(8080, "0.0.0.0")解决方案对您不起作用,因此请确保允许端口 8080 上的连接通过您的防火墙。

这篇文章帮助我在 Windows 防火墙设置中创建了一个新的入站规则。

于 2018-10-26T16:02:07.863 回答
0

同样的问题,对我来说,解决方案是编辑server.js文件第 161 行

 var server = app.listen(argv.port, '**<server.ip.adress.here>**', function() {
 console.log('Cesium development server running publicly.  Connect to localhost:%d/', server.address().port);
    });

替换 localhost><server.ip.adress.here>

于 2020-07-14T13:13:47.180 回答
0

检查您的防病毒防火墙设置。

我有一个在 Windows 10 PC 上运行的 NodeJS 服务器,但是当我将 IP 地址和端口(例如http://102.168.1.123:5000)放入本地网络上另一台计算机的浏览器时,什么也没发生,尽管它在主机上运行良好电脑。

(要查找您的 Windows IP 地址,请运行 CMD,然后运行 ​​IPCONFIG)

Bar Horing Amir的回答指向 Windows 防火墙设置。在我的 PC 上,Windows 防火墙已关闭 - 因为 McAfee 防病毒软件添加了自己的防火墙。

在装有 NodeJS 的计算机上的McAfee防火墙设置下将端口 5000 添加到“端口和系统服务”后,我的系统开始在其他计算机上运行。其他杀毒软件也会有类似的设置。

我会认真建议首先在 Windows 上尝试此解决方案。

于 2021-01-01T17:32:34.280 回答
0

我在这个线程上尝试了许多解决方案,但没有一个对我有用。如果有人遇到与我相同的问题,这就是我解决问题的方法。

在我的反应应用程序中,我将 localhost 更改为 nodejs 服务器 IP。

// Interface to server using Axios
const api = axios.create({ 
  baseURL: 'http://server_ip_addr:4000' 
});

于 2021-11-03T10:23:02.880 回答