Node.js connect仅适用于localhost

时间:2012-12-26 17:25:02

标签: node.js connect

我编写了一个小型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掩码参数。

11 个答案:

答案 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

请参阅此示例用法:

enter image description here

在上面的示例中,本地运行的风帆实例: 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

enter image description here 然后使用IP地址:

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 上尝试这个解决方案。