NodeJS - 错误:listen EADDRNOTAVAIL:地址不可用

17

我正在运行一个Node应用程序,应该托管在本地服务器上。 目前,我只发送纯文本响应。

const http = require('http');

var server = http.createServer(function(req, res) {
  res.writeHead(200, {ContentType: 'text/plain'});
  res.end("test");
});

当我监听本地主机时,一切都正常,并且我可以从浏览器中发送请求。

server.listen(3000, '127.0.0.1'); // works fine, on the same machine

但是,如果我尝试通过键入路由器的IP地址来监听我的LAN网络上的端口,我会收到一个错误。

server.listen(3000, '192.168.0.1'); // causes an error
Error: listen EADDRNOTAVAIL: address not available 192.168.0.1:3
000
    at Server.setupListenHandle [as _listen2] (net.js:1253:19)
    at listenInCluster (net.js:1318:12)
    at doListen (net.js:1451:7)
    at process._tickCallback (internal/process/next_tick.js:63:1
9)
    at Function.Module.runMain (internal/modules/cjs/loader.js:7
57:11)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:622:3)
Emitted 'error' event at:
    at emitErrorNT (net.js:1297:8)
    at process._tickCallback (internal/process/next_tick.js:63:1
9)
    [... lines matching original stack trace ...]
    at bootstrapNodeJSCore (internal/bootstrap/node.js:622:3)

我尝试使用我的公共IP地址,但没有成功。 有没有办法在局域网服务器上监听端口,以便我可以从网络上的任何计算机发送请求?
此外,我希望我的应用程序稍后能够在任何LAN网络上的任何计算机上运行。 如何动态添加我的主机?


1
你尝试过使用IP 0.0.0.0(将监听所有IP)吗?server.listen(3000, '0.0.0.0'); - Xavier Brassoud
你需要设置你的服务器IP而不是路由器IP,然后在路由器中打开一个端口并将一个端口转发到你的服务器。例如,如果你的服务器正在侦听80端口,并且你的路由器上有5458端口正在侦听,那么你应该将其重定向到你的服务器IP加上它的端口,如(192.168.0.x:80)... - David Agustin Melgar
1
@DavidAgustinMelgar 我怎么知道我的路由器正在监听哪个端口?我应该在哪里进行重定向?我的应用程序应该包含什么确切的代码?更清晰的解释会很有帮助。谢谢。 - Nikola
你需要打开路由器设置中的端口转发,将路由器端口设置为机器IP,例如将router:8080设置为192.168.0.4:80。 这是为了从互联网访问您局域网中的Web服务器。 - David Agustin Melgar
6个回答

19

试试这个

server.listen(3000, '0.0.0.0');

你可以从其他机器访问你的Node应用程序

例如,如果您的局域网IP是192.168.0.101,则可以从其他计算机上浏览192.168.0.101:3000


这仍然只监听我的本地主机(127.0.0.1:3000),而不是192.168.0.101:3000。 - Nikola
你正在使用什么操作系统?192.168.0.101 是你的机器 IP 地址吗? - Shubham
我的IP地址现在显示为192.168.0.104,并且它正在使用该地址工作!谢谢! - Nikola
这会导致错误不再发生,但我仍然无法使用我的IP在浏览器中访问它:3000 ERR_CONNECTION_REFUSED。 - Curtis

5

我遇到了这个错误,问题是我连接了VPN。


你的回答可以通过提供更多支持信息来改进。请[编辑]以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community
1
关闭VPN对我有用,我只需要在NUXT开始构建后再次打开它。有时即使我没有连接VPN,甚至重新启动笔记本电脑也会发生这种情况。 - Gabriel

4

注意您的IP地址。 有时候它会发生变化。当我使用Node工作时,我必须在Shell中检查ipconfig……我希望这可以帮助其他遇到同样问题的人……


哇,成功了,谢谢!我以为在谷歌上搜索"我的IP是什么"会给我正确的IP地址,但事实并非如此。它没有给我IPv4地址。所以,通过使用ipconfig解决了我的问题。 - gignu

2

另一个原因

有时候当你在容器内运行应用程序并尝试在容器内使用私有IP地址(例如192.168.10.2)时,就会出现这种情况。由于容器是一个隔离的环境,它不知道你的私有IP地址。

解决方案

你应该使用0.0.0.0:端口来运行Node.js应用程序,然后将该端口绑定到你的私有IP地址上。例如,在Docker Compose中,你应该这样做:

ports:
   - "192.168.10.4:PORT:PORT"

1

正确的IP地址实际上是192.168.0.104。
应该使用服务器机器的IP地址,而不是路由器的IP地址。


0
尝试检查端口和IP组合。我刚刚在SLS的上下文中回答了这个问题,但同样适用于这里。

https://github.com/dherault/serverless-offline/issues/1015

如果是端口问题,你可以通过关闭特定的端口来解决。
``` kill $(lsof -ti:端口号) ```
** 将端口号替换为具体的端口号。
无论是IP问题还是其他问题,都可以通过验证该IP是否仍然分配给考虑中的机器来进行确认。
``` ifconfig | grep IP地址 ```
这个命令适用于Mac机器,但是对于Linux机器可以使用类似的变体。

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