Node.js连接只能在localhost上运行

我使用Connect编写了一个小型的node.js应用程序,它提供了一个网页,然后定期发送更新。 它也接受和logging用户观察到一个磁盘文件。

只要我在本地主机上,它就能正常工作,但是我不能在同一个内部网上看到其他的计算机。 我正在使用端口3000,但更改为端口8080或80没有帮助。

这是我用来build立连接的代码:

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问题之后,我们在listen()中添加了0.0.0.0,但是listen()看​​起来并不是一个IP掩码参数。

很可能您的服务器套接字绑定到回送IP地址127.0.0.1而不是“所有IP地址”符号IP 0.0.0.0 (注意这不是一个networking掩码)。 要确认这一点,运行sudo netstat -ntlp (如果你在Linux上)或者netstat -an -f inet -p tcp | grep LISTEN 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"); 

为了获得其他用户访问您的本地机器,我通常使用ngrok 。 Ngrok将你的本地主机公开到networking上,并且有一个NPM包装器,它很容易安装和启动:

 $ npm install ngrok -g $ ngrok http 3000 

看到这个例子用法:

在这里输入图像描述

在上面的例子中,在localhost:3000上的sails的本地运行实例现在可以在以下url获得: http : //69f8f0ee.ngrok.iohttps://69f8f0ee.ngrok.io

绑定到0.0.0.0是战斗的一半。 有一个IP防火墙(不同于系统首选项)阻止TCP端口。 因此,港口必须通过以下方式畅通无阻:

sudo ipfw添加允许tcp从任何任何

我有这个问题的一个非常简单的解决scheme: 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

我希望这会帮助别人!

在您的应用程序上,使其可以从networking中的任何设备访问:

 app.listen(3000, "0.0.0.0"); 

对于Azure中的NodeJS,GCP和AWS

对于部署在资源pipe理器中的Azure虚拟机,请检查您的虚拟networking安全组,并打开端口或端口范围以使其可达,否则在您的云端点中部署虚拟机以旧版本的Azure。

只要寻找相当于GCP和AWS的

为我工作这一行(只需添加 – 运行时):

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

希望能帮助到你…

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

 Selinux:$ sestatus
 SELinux状态:启用
 SELinuxfs挂载:/ sys / fs / selinux
 SELinux根目录:/ etc / selinux
加载的策略名称:有针对性的
当前模式:{{checkmode}}
configuration文件中的模式:{{checkconfig}}
政策MLS状态:启用
政策deny_unknown状态:允许
最大内核策略版本:30

 Firewalld状态:$ systemctl status firewalld