我正在测试一个应用程序(希望在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上监听?


当前回答

OMG ! !就我而言,我正在做....监听(ip, port)而不是…listen(port, ip),并抛出错误信息

我使用的端口号>= 3000,甚至尝试使用管理员访问。结果什么都没有。然后仔细一看,我发现了这个问题。改成了…听(端口,ip),一切开始工作正常!!

只是把它说出来,以防它对其他人有用……

其他回答

我在我的mac上得到了这个错误,因为它在默认情况下运行apache服务器使用的端口与节点服务器使用的端口相同,在我的情况下是端口80。我所要做的就是用sudo apachectl stop停止它

希望这能帮助到一些人。

错误:监听EACCES:权限被拒绝3000; 我添加“PORT = 3000;”而“PORT = 3000”。 只需分号“;”给出错误

删除分号,项目成功运行

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

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

PORT=8080 # The port the server runs at

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

使用Windows 10和Git Bash。


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

这意味着该端口在其他地方被使用。因此,您需要尝试另一个端口或停止使用旧端口。

2023

Linux(任何发行版)

您可以使用CAP_NET_BIND_SERVICE,这是Linux的核心功能之一:

CAP_NET_BIND_SERVICE 将套接字绑定到Internet域特权端口(端口号小于1024)。

您可以给任何二进制文件一个永久权限来访问< 1024个端口。

以Node.js为例,它看起来像:

sudo setcap CAP_NET_BIND_SERVICE=+eip $(which node)

如果您愿意,您也可以稍后通过运行以下命令删除此权限:

setcap -r $(which node)