我正在测试一个应用程序(希望在heroku上运行,但在本地也有问题)。当它运行http.Server.listen()时,它给我一个EACCES错误-但它只发生在一些端口上。

我在本地运行:

joe@joebuntu:~$ node
> var h = require('http').createServer();
> h.listen(900);
Error: EACCES, Permission denied
    at Server._doListen (net.js:1062:5)
    at net.js:1033:14
    at Object.lookup (dns.js:132:45)
    at Server.listen (net.js:1027:20)
    at [object Context]:1:3
    at Interface.<anonymous> (repl.js:150:22)
    at Interface.emit (events.js:42:17)
    at Interface._onLine (readline.js:132:10)
    at Interface._line (readline.js:387:8)
    at Interface._ttyWrite (readline.js:564:14)

我没有在端口900(或我尝试过的其他20个端口中的任何一个)上运行任何东西,因此这应该可以工作。奇怪的是,它确实在某些端口上工作。例如,端口3000可以正常工作。

是什么导致了这种情况?

更新1:

我发现在我的本地计算机上,EACCES错误出现了,因为我必须以root身份运行node才能绑定到那些特定的端口。我不知道为什么会发生这种情况,但是使用sudo可以修复它。然而,这并不能解释我如何在Heroku上修复它。没有办法在Heroku上以root身份运行,所以我怎么能在端口80上监听?


当前回答

我有一个类似的问题,它拒绝在端口8080上运行,但也拒绝任何其他端口。

事实证明,这是因为环境。它读取的本地文件在变量名后面包含注释,例如:

PORT=8080 # The port the server runs at

它这样解释它,试图使用端口“8080 #服务器运行的端口”,这显然是一个无效的端口(-1)。 删除注释完全解决了这个问题。

使用Windows 10和Git Bash。


我知道这不是这里描述的问题,但它可能会帮助到一些人。我在这个问题上寻找问题的答案,所以…也许?

其他回答

对我有用的是,

解决方法1:我发现我的.env文件不正确。你不应该在变量之间使用','或';'分隔符。

解决方案2:如果它是一个react应用程序,确保你在客户端目录下,并且你没有试图在服务器目录下运行你的react应用程序(不是给你一个错误,而是解决问题)。

试试authbind:

http://manpages.ubuntu.com/manpages/hardy/man1/authbind.1.html

安装完成后,可以在“/etc/authbind/byport/”文件夹中添加一个以端口号命名的文件

使用chmod给它500个权限,并将所有权更改为您想要在其下运行程序的用户。

之后,在项目中以该用户执行“authbind node…”。

如果你使用的是Windows。您应该重新启动Windows NAT Driver服务。

以管理员身份打开命令提示符并运行

net stop winnat

then

net start winnat

就是这样。

这是因为我安装了Nord VPN,它是自动盯着窗口。

我的错误已通过使用(Windows)解决

app.set('PORT', 4000 || process.env.PORT);

app.listen(app.get('PORT'), <IP4 address> , () => {
    console.log("Server is running at " + app.get('PORT'));
});

在Windows防火墙中允许NodeJS应用程序访问网络。

剧透警告:这个答案可能看起来有点好笑。

我花了10多分钟来找出系统中这个错误的根本原因。我使用的是:PORT=2000;在我的。env文件中。

希望你已经发现了。我在声明端口号后使用了一个分号:(我删除了额外的符号,它开始工作。

我知道这可能不是这个问题的答案,但希望它能帮助那些面临同样问题的人。