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


当前回答

同样的问题也发生在我身上。 你需要检查你设置监听端口的server.js文件。在所有地方明智地更改端口号,它将有望解决您的问题。

其他回答

在工作站上运行

作为一般规则,没有根权限的进程不能绑定到1024以下的端口。

所以尝试一个更高的端口,或者通过sudo以更高的权限运行。在使用进程绑定到低端口后,可以降级特权。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}`));

因此,可能的原因是环境变量名称输入错误或没有安装dotenv包。

因此,如果有任何其他错误除了typo和dotenv npm包,那么你必须尝试下面给出的这些解决方案:

第一个解决方案 仅适用于Windows

打开cmd,以管理员身份运行,然后写两个命令

Net stop winnat Net start winnat

希望这能解决问题…

第二个解决方案 仅适用于Windows

确保在您的环境变量中,变量末尾没有分号(;),变量名之后也没有冒号(:)。

例如,我在我的项目中,我的env变量不工作,所以我的。env文件的结构是像PORT:5000;CONNECTION_URL: MongoDbString。<密码> / < dbname >;所以它给了我这个错误

Error: listen EACCES: permission denied 5000;
at Server.setupListenHandle [as _listen2] (node:net:1313:21)
at listenInCluster (node:net:1378:12)
at Server.listen (node:net:1476:5)
at Function.listen (E:\MERN REACT\mern_memories\server\node_modules\express\lib\application.js:618:24)
at file:///E:/MERN%20REACT/mern_memories/server/index.js:29:9
at processTicksAndRejections (node:internal/process/task_queues:96:5)

在服务器实例上触发'error'事件: at emiterrnt (node:net:1357:8) at processTicksAndRejections (node:internal/process/task_queues:83:21) { 代码:“EACCES”, errno: -4092, 系统调用:“听”, 地址:“5000年,”, 港口:1 } [nodemon]应用崩溃-在启动前等待文件更改…

所以我在我的env文件中做了一些更改,这次我删除了冒号(:),并将其替换为等于(=),并在末尾删除了分号,所以我的.env文件看起来像这样

PORT = 5000
CONNECTION_URL = MongoDbString.<password>/<dbname>

在改变这些东西后,我的服务器在端口5000上运行,没有任何警告和问题

希望这能起作用…

#代码#开发人员#mernstack #nodejs #react #windows #主机服务网络#http #权限拒绝#EACCES:-4092

在Windows系统上,重新启动“主机网络服务”服务,解决了该问题。

我的mac上也有这个错误。我使用npm run dev在Windows中运行我的Nodejs应用程序,它工作得很好。但是我在我的mac上得到了这个错误-给出的错误是:错误:绑定EACCES null:80。

解决这个问题的一种方法是使用根访问权限运行它。你可以使用sudo npm运行dev,并需要输入密码。

通常最好在非特权端口(如3000)上为应用程序提供服务,该端口无需根权限也能工作。

参考:Node.js EACCES错误时监听http 80端口(权限被拒绝)

如果有人仍然面临这个问题,那么按照下面的步骤进行。 以管理员身份打开命令行并输入

停止HTTP 命令, 它将停止您正在使用端口80的所有服务。

现在运行你的项目,它将为windows操作系统工作。