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


在工作站上运行

作为一般规则,没有根权限的进程不能绑定到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}`));

非特权用户(非root)无法打开1024以下端口上的侦听套接字。


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

希望这能帮助到一些人。


这意味着节点不能在定义的端口上侦听。将其更改为1234或2000或3000并重新启动服务器。


记住,如果你使用sudo绑定到端口80,并使用环境变量port和NODE_ENV,你必须重新导出这些变量,因为你现在在根配置文件下,而不是你的用户配置文件下。所以,为了让它在我的Mac上工作,我做了以下工作:

sudo su
export NODE_ENV=production
export PORT=80
docpad run

如果您试图在其上本地托管的端口是组合的,则会发生这种情况


查看这个参考链接:

Give Safe User Permission To Use Port 80 Remember, we do NOT want to run your applications as the root user, but there is a hitch: your safe user does not have permission to use the default HTTP port (80). You goal is to be able to publish a website that visitors can use by navigating to an easy to use URL like http://ip:port/ Unfortunately, unless you sign on as root, you’ll normally have to use a URL like http://ip:port - where port number > 1024. A lot of people get stuck here, but the solution is easy. There a few options but this is the one I like. Type the following commands: sudo apt-get install libcap2-bin sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\`` Now, when you tell a Node application that you want it to run on port 80, it will not complain.


试试authbind:

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

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

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

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


另一种方法是进行端口重定向:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 900 -j REDIRECT --to-port 3000

在>1024端口上运行服务器:

require('http').createServer().listen(3000);

顺便说一下,https(443)端口也可以这样做。


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

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

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

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


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

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

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


在尝试了许多不同的方法之后,在我的窗口上重新安装IIS解决了这个问题。


我的错误已通过使用(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应用程序访问网络。


我的错误通过在server.js中更改端口号得到解决 特别是在这一行

const port = process.env.PORT || 8085;

我把端口号从8080改成了8085。

希望能有所帮助。


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

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

PORT=8080 # The port the server runs at

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

使用Windows 10和Git Bash。


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


重启还不够!解决这个问题的唯一办法是:

你必须终止在该端口上运行的服务。

在cmd下,以管理员身份运行,然后输入: Netstat -aon | find /i "listening"

然后,您将获得一个带有活动服务的列表,搜索在4200n上运行的端口,并使用进程id(最后一列)来终止它

taskkill /F /PID 2652


对我来说,这个问题影响了PowerShell中的所有主机和Windows上的所有端口。

禁用网络接口修复了这个问题。

我有WiFi和以太网连接,禁用以太网接口解决了这个问题。

打开“网络连接”以查看接口。右键单击,选择“禁用”。


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


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


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


#窗口

另一个原因——也许你的端口已经被某些原因排除在外了。

所以,尝试在管理员权限下打开CMD(命令行)并运行:

Net stop winnat Net start winnat

对我来说,这就足够了。

解决方案:https://medium.com/@Bartleby/ ports-the-- availal-listen-tcp -0-0-0-3000-165892441b9d


对我来说,这只是.env文件中的一个错误。我删除了每行末尾的逗号,问题就解决了。

之前:

HOST=127.0.0.1,

后:

HOST=127.0.0.1

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

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

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

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


对我来说,问题是在没有关闭快速运行服务器的情况下退出节点应用程序。


您可以在主文件中使用此代码 const PORT = process.env.PORT || APP_PORT;


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

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

net stop winnat

then

net start winnat

就是这样。

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


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

删除分号,项目成功运行


我有一个类似的问题,它拒绝在端口5000上运行,

事实证明,这是因为环境。本地文件在变量名后面包含逗号(';'),例如:

端口= 5000; 它这样解释它,试图使用端口“5000;”,这显然是一个无效的端口(-1)。删除';'完全解决了这个问题。

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


这对我来说工作得很好,用这个代码将你的端口设置在页面底部

     let port = process.env.PORT;
if (port == null || port == "") {
    port = 3000;
}

app.listen(port, function() {
    console.log('app started successfully')
});

有时这是因为网点配置不好。例如:require(“dotenv”)。在你的应用程序中间件中配置没有(),或者可能是你用错误的语法写了你的端口号,比如你写了:而不是=,或者在端口号中添加了一些其他符号。


对我有用的是,

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

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


我尝试了上面给出的每个答案,但没有任何工作,然后我发现我忘记在.env文件中声明变量之前添加const。

之前:

PORT = 5000;
HOST = "127.0.0.1";

后:

const PORT = 5000;
const HOST = "127.0.0.1";

因此,可能的原因是环境变量名称输入错误或没有安装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


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

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

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


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)