我正在测试一个应用程序(希望能在 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 上监听呢?
some string
上收听的一个错误,然后您得到了令人困惑的 EACCES
errpr。
在您的工作站上运行
作为一般规则,没有 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}`));
非特权用户(非 root)无法在低于 1024 的端口上打开侦听套接字。
sudo
(实际上是 gulp)。所以没有意义
#视窗
另一个原因 - 也许您的端口已被某些原因排除在外。
因此,尝试在管理员权限下打开 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
检查此 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 上运行时,它将不要抱怨。
pm2 kill
杀死您的 pm2 并重新创建它。
在 Windows 系统上,重新启动服务“Host Network Service”,解决了该问题。
如果您使用的是窗户。您应该尝试重新启动 Windows NAT 驱动程序服务。
以管理员身份打开命令提示符并运行
net stop winnat
然后
net start winnat
而已。
这是因为我安装了 Nord VPN。它是自动盯着窗户看的。
另一种方法是进行端口重定向:
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) 端口也可以这样做。
我的天啊!!就我而言,我在做 ....listen(ip, port)
而不是 ...listen(port, ip)
并且抛出了错误消息:Error: listen EACCES localhost
我正在使用端口号&gt; = 3000,甚至尝试使用管理员访问权限。什么都没解决。然后仔细观察,我注意到了这个问题。将其更改为 ...listen(port, ip)
,一切开始正常!
如果它对其他人有用,只需将其称为...
....listen(ip, port)
(四个 .
)?因此,我花了一分钟才意识到您在谈论论点的顺序。
....
(四个点)放在那里,我认为这很明显。
....listen(port, IP)
,但它抛出了错误 listen EACCES: permission denied 127.0.0.1
。我看到了您的回答,这让我更加关注错误,我将其更改为 ....listen(ip, port)
并且它有效。
这意味着节点无法监听定义的端口。将其更改为 1234 或 2000 或 3000 并重新启动服务器。
我有一个类似的问题,它拒绝在端口 8080 上运行,但也拒绝在任何其他端口上运行。
原来,这是因为它读取的 env.local
文件包含变量名称后的注释,例如:
PORT=8080 # The port the server runs at
它会这样解释它,试图使用端口“8080 # The port the server runs at
”,这显然是一个无效的端口 (-1)。删除评论完全解决了它。
顺便说一下,使用 Windows 10 和 Git Bash。
我知道这不完全是这里描述的问题,但它可能会帮助那里的人。我找到了这个问题,寻找我的答案,所以......也许?
剧透警报:这个答案可能看起来有点滑稽。
我花了 10 多分钟来找出系统中此错误的根本原因。我在我的 .env 文件中使用了这个:PORT=2000;
。
希望你已经发现了。我在声明端口号后使用了分号 :'( 我删除了多余的符号并开始工作。
我知道这可能不是这个问题的答案,但希望它可以帮助遇到同样问题的其他人。
我在我的 mac 上遇到了这个错误,因为它默认使用与节点服务器使用的端口相同的端口运行 apache 服务器,在我的例子中是端口 80。我所要做的就是用 sudo apachectl stop
停止它
希望这可以帮助某人。
我的 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)
重启还不够!解决问题的唯一方法是通过以下方式:
您必须终止在该端口上运行的服务。
在 cmd 中,以管理员身份运行,然后键入:netstat -aon | find /i "listening"
然后,您将获得一个包含活动服务的列表,搜索在 4200n 上运行的端口并使用最后一列的进程 ID 来杀死它
:taskkill /F /PID 2652
请记住,如果您使用 sudo 绑定到端口 80 并使用 env 变量 PORT 和 NODE_ENV 您必须重新导出这些变量,因为您现在位于根配置文件而不是您的用户配置文件下。所以,为了让它在我的 Mac 上工作,我做了以下工作:
sudo su
export NODE_ENV=production
export PORT=80
docpad run
如果您尝试在本地托管的端口被端口转发,则会发生这种情况
尝试身份验证:
http://manpages.ubuntu.com/manpages/hardy/man1/authbind.1.html
安装后,您可以在以下文件夹中添加一个带有您要使用的端口号名称的文件:/etc/authbind/byport/
使用 chmod 授予它 500 权限,并将所有权更改为您要在其下运行程序的用户。
之后,在项目中以该用户身份执行“authbind node ...”。
使用(在 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 防火墙中的网络。
仅通过更改 server.js 中的端口号就解决了我的错误,特别是在这一行中
const port = process.env.PORT || 8085;
我将端口号从 8080 更改为 8085。
希望能帮助到你。
对我来说,这个问题影响了 PowerShell 中 Windows 上的所有主机和所有端口。
禁用网络接口解决了这个问题。
我有 WiFi 和以太网连接,禁用以太网接口解决了这个问题。
打开“网络连接”以查看您的接口。右键单击并选择“禁用”。
这意味着该端口在其他地方使用。因此,您需要尝试另一个或停止使用旧端口。
在尝试了许多不同的方法后,在我的 Windows 上重新安装 IIS 解决了这个问题。
同样的问题也发生在我身上。您需要检查您设置监听端口的 server.js 文件。在所有地方明智地更改端口号,它有望解决您的问题。
对我来说,这只是 .env 文件中的一个错误。我删除了每行末尾的逗号并解决了。
前:
HOST=127.0.0.1,
后:
HOST=127.0.0.1
对我来说,问题是在没有关闭快速运行的服务器之前退出我的节点应用程序。
错误:监听 EACCES:权限被拒绝 3000;我添加“端口 = 3000;”而 "PORT = 3000" 。只是分号";"给出错误
删除分号,项目运行成功
我有一个类似的问题,它拒绝在端口 5000 上运行,
原来,这是因为 env.local 文件在变量名之后包含逗号(';'),例如:
端口= 5000;它会这样解释它,试图使用端口“5000;”,这显然是一个无效的端口(-1)。删除';'彻底解决了。
我知道这不完全是这里描述的问题,但它可能会帮助那里的人。我找到了这个问题,寻找我的答案,所以......也许?
这对我来说非常好用,请使用此代码将您的端口设置在页面底部
let port = process.env.PORT;
if (port == null || port == "") {
port = 3000;
}
app.listen(port, function() {
console.log('app started successfully')
});
有时是因为 dot.env 配置错误,例如:在您的应用程序中间件中没有 () 的 require("dotenv").config 或者可能是您使用错误的语法编写端口号,例如而不是 = 您编写:或添加端口号中的一些其他符号。
对我有用的是,
解决方案 1: 我发现我的 .env file
不正确。您应该not put ',' or ';'
在变量之间使用分隔符。`
解决方案 2: 如果它是一个 react 应用程序,请确保您位于客户端目录中并且您要not trying
运行您的 react 应用程序 in the server directory
(不是给您错误,而是解决问题.)
不定期副业成功案例分享
crossdomain.xml
。