ChatGPT解决这个技术问题 Extra ChatGPT

侦听大多数端口时出现 Node.js EACCES 错误

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

传统上少于 1024 的端口需要提升权限。在 Heroku 上你不监听 80 端口,你监听他们通过环境变量告诉你的端口,并让他们的路由层处理边缘上的 80 端口绑定。
您的更新 1 帮助了我。 'sudo node myporgram.js' 让它运行。
如果这对任何人都有帮助:双重和三重检查您正在侦听端口 number。由于我在 some string 上收听的一个错误,然后您得到了令人困惑的 EACCES errpr。
@Marc 你是对的。端口需要是一个数字,尤其是在使用 https 服务器时。我在这里发布了一个答案:stackoverflow.com/a/70950946/10030693

B
Ben Taber

在您的工作站上运行

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

所以尝试更高的端口,或通过 sudo 以提升的权限运行。使用 process.setgidprocess.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}`));

这是否意味着我必须使用 Heroku 提供的端口,然后他们会在幕后施展魔法将其转移到 80 端口?如果我想运行不在端口 80 上的东西怎么办?
是的。您只能在 $PORT 上收听我们告诉您的端口 我们负责将 80 或 443 路由到您的端口。当我们移动您的测功机时,实际端口一直在变化。目前我们只支持从 80 到 443 的公共路由。
@Will,有没有解除限制的机会?具体来说,是否能够监听 80 或 443 以外的端口?考虑到所有因素,这是一个非常严格的集合。
为什么您希望您的应用程序在与 http 和 https 不同的端口上运行?
@Will 我想在 Heroku 上托管一个简单的游戏服务器。 Unity 需要通过 843 端口传输 crossdomain.xml
u
user1303768

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


赞成 - 这是一个很好的一般规则,但也有例外,例如 Linux 上的“功能”。
您刚刚为我节省了数小时的调试时间。我不知道那件事。
不过我不喜欢这样,我不想在使用节点运行快速服务器时必须sudo(实际上是 gulp)。所以没有意义
这条智慧
@blamb 然后使用 MeetMehta's solution ;^)
N
Nigrimmist

#视窗

另一个原因 - 也许您的端口已被某些原因排除在外。

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

净停止winnat 净开始winnat

https://i.stack.imgur.com/5V5ob.png

就我而言,这就足够了。

在此处找到解决方案:https://medium.com/@Bartleby/ports-are-not-available-listen-tcp-0-0-0-0-3000-165892441b9d


这是唯一对我有用的解决方案。
这解决了我的问题,谢谢。但是,谁能解释一下是什么突然导致了这个问题?
这对我有用
也为我工作!
D
DJCrashdummy

检查此 reference link

授予安全用户使用端口 80 的权限 请记住,我们不想以 root 用户身份运行您的应用程序,但有一个问题:您的安全用户没有使用默认 HTTP 端口 (80) 的权限。您的目标是能够通过导航到易于使用的 URL(例如 http://ip:port/)来发布访问者可以使用的网站 不幸的是,除非您以 root 身份登录,否则您通常必须使用类似的 URL http://ip:port - 端口号 > 1024。很多人都卡在这里,但解决方案很简单。有几个选择,但这是我喜欢的一个。键入以下命令: sudo apt-get install libcap2-bin sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\`` 现在,当您告诉 Node 应用程序您希望它在端口 80 上运行时,它将不要抱怨。


这绝对是最好的解决方案。
@MarkLagendijk:谢谢马克。我也错误地问了同样的问题,并在这里发布了详细的答案stackoverflow.com/questions/23281895/…。也可以随意编辑它。
为什么不是这个答案👍
@KhaledMohamedP:很高兴它有帮助:)
谁说这仍然不适用于 pm2 模块。使用 pm2 kill 杀死您的 pm2 并重新创建它。
S
Sandeep K

在 Windows 系统上,重新启动服务“Host Network Service”,解决了该问题。


这需要更多的赞成票!谢谢 - 有时我遇到了这个问题,总是不得不重新启动整个机器。
这为我解决了这个问题!谁能帮我理解为什么以及如何?
终于有了比重启更好的答案!
R
Ridwan Malik

如果您使用的是窗户。您应该尝试重新启动 Windows NAT 驱动程序服务。

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

net stop winnat

然后

net start winnat

而已。

这是因为我安装了 Nord VPN。它是自动盯着窗户看的。


e
eleven

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

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

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

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

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


谢谢谢谢!这为我节省了一个小时的安全端口调试时间,另一个小时用于 SSL 重定向,还允许我限制 AWS Lightstail 上开发服务器的可见性(不允许通过 IP 地址微调请求)。
D
Dilip Muthukurussimana

我的天啊!!就我而言,我在做 ....listen(ip, port) 而不是 ...listen(port, ip) 并且抛出了错误消息:Error: listen EACCES localhost

我正在使用端口号&gt; = 3000,甚至尝试使用管理员访问权限。什么都没解决。然后仔细观察,我注意到了这个问题。将其更改为 ...listen(port, ip),一切开始正常!

如果它对其他人有用,只需将其称为...


谢谢!我有同样的问题。我习惯于使用主机名、端口的所有其他 API。
我在尝试运行 Wekan docker 镜像时遇到了这个问题。我用这个技巧解决了。谢谢你。
@dilip-muthukurussimana 您是否打算在答案中包含 ....listen(ip, port)(四个 .)?因此,我花了一分钟才意识到您在谈论论点的顺序。
是的,我的意思只是论据的顺序。请不要把....(四个点)放在那里,我认为这很明显。
我的情况正好相反。我正在使用 Nodejs v14.17.5 我一直在使用 ....listen(port, IP),但它抛出了错误 listen EACCES: permission denied 127.0.0.1。我看到了您的回答,这让我更加关注错误,我将其更改为 ....listen(ip, port) 并且它有效。
B
Bo Persson

这意味着节点无法监听定义的端口。将其更改为 1234 或 2000 或 3000 并重新启动服务器。


F
Fusseldieb

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

原来,这是因为它读取的 env.local 文件包含变量名称后的注释,例如:

PORT=8080 # The port the server runs at

它会这样解释它,试图使用端口“8080 # The port the server runs at”,这显然是一个无效的端口 (-1)。删除评论完全解决了它。

顺便说一下,使用 Windows 10 和 Git Bash。

我知道这不完全是这里描述的问题,但它可能会帮助那里的人。我找到了这个问题,寻找我的答案,所以......也许?


是的,我经历过这个。 .env 文件中的值之后的注释可能会导致此问题。
l
luffy

剧透警报:这个答案可能看起来有点滑稽。

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

希望你已经发现了。我在声明端口号后使用了分号 :'( 我删除了多余的符号并开始工作。

我知道这可能不是这个问题的答案,但希望它可以帮助遇到同样问题的其他人。


好的,我犯了同样的错误,找不到错误并浪费了一天。这个答案帮助了我。谢谢
多谢兄弟。我犯了同样的错误:-)
m
mabounassif

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

希望这可以帮助某人。


b
bschlueter

我的 Mac 上也出现了这个错误。我使用 npm run dev 在 Windows 中运行我的 Nodejs 应用程序,它运行良好。但是我在我的 Mac 上遇到了这个错误 - error given was: Error: bind EACCES null:80

解决此问题的一种方法是使用 root 访问权限运行它。您可以使用 sudo npm run dev 并且需要您输入密码。

通常最好在非特权端口(例如 3000)上为您的应用程序提供服务,该端口无需 root 权限即可工作。

参考:Node.js EACCES error when listening on http 80 port (permission denied)


F
Fahima Mokhtari

重启还不够!解决问题的唯一方法是通过以下方式:

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

在 cmd 中,以管理员身份运行,然后键入:netstat -aon | find /i "listening"

然后,您将获得一个包含活动服务的列表,搜索在 4200n 上运行的端口并使用最后一列的进程 ID 来杀死它

taskkill /F /PID 2652


P
PA.

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

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

J
Jasper Smith

如果您尝试在本地托管的端口被端口转发,则会发生这种情况


D
DraughtGlobe

尝试身份验证:

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

安装后,您可以在以下文件夹中添加一个带有您要使用的端口号名称的文件:/etc/authbind/byport/

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

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


P
Prathamesh More

使用(在 Windows 上)解决了我的错误

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

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

允许 NodeJS 应用访问 Windows 防火墙中的网络。


A
Alok Ranjan

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

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

我将端口号从 8080 更改为 8085。

希望能帮助到你。


m
mrjamiebowman

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

禁用网络接口解决了这个问题。

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

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


H
Hosayn Sayed

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


C
CageE

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


Z
Zeeshan Ali Khan

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


A
Adrian Mole

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

前:

HOST=127.0.0.1,

后:

HOST=127.0.0.1

O
Or Assayag

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


k
khizar ijaz

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

删除分号,项目运行成功


您的答案可以通过额外的支持信息得到改进。请edit添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。您可以找到有关如何写出好答案的更多信息in the help center
1
19UEC115 SOHAM SAKHARELIYA

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

原来,这是因为 env.local 文件在变量名之后包含逗号(';'),例如:

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

我知道这不完全是这里描述的问题,但它可能会帮助那里的人。我找到了这个问题,寻找我的答案,所以......也许?


请在此处针对问题的答案。寻找相关部分。回答不同的问题,即使相似,也不合适。
另一方面,如果这确实回答了问题,但仅使用已经在其他答案中的信息(例如 stackoverflow.com/a/71235768/7733418 ),则根本不需要此答案。
M
Magdi T.

这对我来说非常好用,请使用此代码将您的端口设置在页面底部

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

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

S
Sayeed Mahdi Mousavi

有时是因为 dot.env 配置错误,例如:在您的应用程序中间件中没有 () 的 require("dotenv").config 或者可能是您使用错误的语法编写端口号,例如而不是 = 您编写:或添加端口号中的一些其他符号。


T
The Gentelmen 24

对我有用的是,

解决方案 1: 我发现我的 .env file 不正确。您应该not put ',' or ';' 在变量之间使用分隔符。`

解决方案 2: 如果它是一个 react 应用程序,请确保您位于客户端目录中并且您要not trying运行您的 react 应用程序 in the server directory(不是给您错误,而是解决问题.)