一尘不染

在大多数端口上侦听时,Node.js EACCES错误

node.js

我正在测试一个应用程序(希望可以在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用户身份运行节点才能绑定到这些特定端口。我不知道为什么会这样,但是使用sudo可以解决。但是,这并不能解释我将如何在Heroku上修复它。在Heroku上无法以root用户身份运行,那么如何在80端口监听?


阅读 243

收藏
2020-07-07

共1个答案

一尘不染

在您的工作站上运行

通常,没有root特权运行的进程不能绑定到低于1024的端口。

因此,请尝试使用更高的端口,或者通过来以更高的特权运行sudo。使用process.setgid和绑定到低端端口后,可以降级特权process.setuid

在heroku上运行

在heroku上运行应用程序时,必须使用PORT环境变量中指定的端口。

参见http://devcenter.heroku.com/articles/node-
js

const server = require('http').createServer();
const port = process.env.PORT || 3000;

server.listen(port, () => console.log(`Listening on ${port}`));
2020-07-07