我编写了一个小型node.js应用程序,使用Connect,提供网页,然后定期发送更新。它还接受用户观察并将其记录到磁盘文件中。
只要我在localhost上,它就可以正常工作,但是我无法让同一个内部网上的其他计算机看到它。我使用的是端口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相关的类似问题之后,我还想到将1.0.0.0添加到listen()但是看起来listen()似乎没有IP掩码参数。
答案 0 :(得分:87)
很可能您的服务器套接字绑定到环回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");
答案 1 :(得分:63)
要获得其他用户访问本地计算机的权限,我通常使用ngrok。 Ngrok将您的localhost暴露给Web,并且有一个易于安装和启动的NPM包装器:
$ npm install ngrok -g
$ ngrok http 3000
请参阅此示例用法:
在上面的示例中,本地运行的风帆实例: localhost:3000 现在可在Internet上使用: http://69f8f0ee.ngrok.io 或 https://69f8f0ee.ngrok.io 强>
答案 2 :(得分:5)
绑定到0.0.0.0是成功的一半。有一个阻止TCP端口的IP防火墙(与系统首选项中的防火墙不同)。因此,端口必须通过以下方式解除阻塞:
sudo ipfw add <PORT NUMBER> allow tcp from any to any
答案 3 :(得分:4)
对于这个问题,我有一个非常简单的解决方案: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]);
现在,您的应用正在倾听&#34;所有&#34; IP地址,例如http://192.168.1.4:3000/your_app。
我希望这能帮助别人!
答案 4 :(得分:4)
在您的应用上,可以通过网络中的任何设备访问该网址:
app.listen(3000, "0.0.0.0");
对于Azure中的NodeJS,GCP&amp; AWS 强>
对于部署在资源管理器中的Azure vm,请检查虚拟网络安全组并打开端口或端口范围以使其可访问,否则在云端点中,如果vm部署在旧版本的azure中。
只需为GCP和AWS寻找相应的内容
答案 5 :(得分:1)
Fedora 或 Centos 发行版检查你的selinux和firewalld在我的情况下firewalld阻止了连接:
Selinux: $sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: {{checkmode}} Mode from config file: {{checkconfig}} Policy MLS status: enabled Policy deny_unknown status: allowed Max kernel policy version: 30 Firewalld status: $systemctl status firewalld
答案 6 :(得分:0)
使用此行为我工作(只需在运行时添加 - listen ):
node server.js -p 3000 -a : --listen 192.168.1.100
希望它有所帮助...
答案 7 :(得分:0)
在解决此问题一段时间后,我设法通过允许 端口8080上的传入连接。
由于您写道.listen(8080, "0.0.0.0")
解决方案不适合您,
确保通过防火墙允许端口8080上的连接。
This post帮助我在Windows防火墙设置中创建了一个新的入站规则。
答案 8 :(得分: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>
答案 9 :(得分:0)
在我的情况下,我必须同时使用两个符号IP地址“ 0.0.0.0”并在收听服务器时回叫 “芯数”:“ ^ 2.8.5”, “表达”:“ ^ 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
app.listen(port,"192.168.0.131" ,() => {
console.log(`Server is running on port ${port}`);
});
如果使用固定的IP地址(例如“ 192.168.0.131”),则必须在调用服务器时使用它,例如,以下是我的api客户端的api调用配置:
REACT_APP_API_URL = http://192.168.0.131:8001/api
答案 10 :(得分: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 上尝试这个解决方案。