错误: 监听EACCES:权限被拒绝 0.0.0.0:3001

13
我已经查看了很多这里的答案,但都没有解决我的错误。以下是我迄今为止尝试过的内容。
环境:
win 10 pro v2004 build 19041.29

node v12.14.1
  1. 使用netstat -a -b命令查看该端口是否被其他进程占用,但没有任何进程在使用此端口。尝试将端口更改为3000后仍然出现相同的错误。

  2. 我使用Docker桌面和WSL2,因此一个接一个地禁用了所有虚拟网络适配器。在停止所有其他Docker服务后进行了尝试。

  3. 重新启动电脑。

  4. 以管理员身份通过PowerShell运行npm start命令。

Server.js

const app = require('./src/app');

const port = process.env.PORT || 3000;
app.listen(port, () => {
  console.log(`Litening on port ${port}...`);
});

错误:
events.js:200
      throw er; // Unhandled 'error' event
      ^

Error: listen EACCES: permission denied 0.0.0.0:3001
    at Server.setupListenHandle [as _listen2] (net.js:1289:21)
    at listenInCluster (net.js:1354:12)
    at Server.listen (net.js:1442:7)
    at Function.listen (C:\Users\sujeet\project\node_modules\express\lib\application.js:618:24)
    at Object.<anonymous> (C:\Users\sujee\CustomerAPIs\server.js:4:5)
    at Module._compile (internal/modules/cjs/loader.js:955:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:991:10)
    at Module.load (internal/modules/cjs/loader.js:811:32)
    at Function.Module._load (internal/modules/cjs/loader.js:723:14)
    at Function.Module.runMain (internal/modules/cjs/loader.js:1043:10)
    at internal/main/run_main_module.js:17:11
Emitted 'error' event on Server instance at:
    at emitErrorNT (net.js:1333:8)
    at processTicksAndRejections (internal/process/task_queues.js:81:21) {
  code: 'EACCES',
  errno: 'EACCES',
  syscall: 'listen',
  address: '0.0.0.0',
  port: 3001
}
4个回答

37
对于在尝试将Node.js服务器绑定到特定端口时遇到“EACCES:permission denied”错误的Windows用户,请按照以下步骤操作:
1. 以管理员身份运行PowerShell: 确保系统级命令具有提升的权限。
2. 停止“winnat”服务:
net stop winnat

这将停止Windows网络地址转换(NAT)服务,该服务负责动态地将私有IP地址转换为公共IP地址,这对于互联网连接至关重要。
3. 重新启动“winnat”服务:
net start winnat

这个命令会恢复 winnat 服务,重新建立 NAT 功能。 技术解释: 端口绑定和权限: “EACCES”错误是由于在尝试将Node.js服务器绑定到特定IP地址和端口时权限不足而引起的。 以管理员身份运行PowerShell可以获得执行此操作所需的权限。
Windows NAT服务(“winnat”): “winnat”是负责网络地址转换的关键服务。在服务器端口绑定过程中,可能会发生冲突,因为“winnat”动态管理私有IP地址到公共IP地址的转换,影响了绑定过程。
动态服务交互: 临时停止“winnat”会动态修改NAT服务的状态。这是一种策略性措施,用于在Node.js服务器可以绑定端口而不受NAT服务争用的临时窗口。
临时网络调整: 命令net stop winnat指示Windows暂时挂起NAT服务。这种暂停是一种策略性的举措,为Node.js服务器提供了一个短暂的机会,以便在绑定端口时不会遇到权限问题。
Node.js服务器绑定尝试: 在“winnat”暂时停止的情况下,Node.js服务器可以成功绑定到所需的端口。这一步骤对于确保服务器能够发起和建立连接而不被拒绝是至关重要的,而拒绝是由于权限不足引起的。
网络状态恢复: 随后的命令net start winnat会重新启动“winnat”服务,恢复正常的网络功能。这确保了为服务器绑定过程所做的任何临时调整都会被撤销,从而防止对其他依赖网络的进程造成潜在的中断。
这一系列的命令被精心设计,旨在处理Windows服务的复杂性,特别是在将Node.js服务器绑定到端口时,解决了'winnat'服务带来的挑战。

为什么以及如何运作? - undefined
这就像是暂时停止一个动态的过程,给我们的服务器一个“机会窗口”,让它在没有竞争的情况下占用端口。 - undefined

4
似乎Windows已经更改了其默认的动态端口范围。
您可以使用此命令来检查您的动态端口范围。
netsh int ipv4 show dynamicport tcp

如果您想要使用的端口在范围内,您可以使用此命令更改它。

netsh int ipv4 set dynamic tcp start=10000 num=10000

您可以更改起始端口号和所需端口数量。

更改后不要忘记重新启动计算机。


0

可能是端口被其他程序占用了。尝试以管理员身份运行终端并尝试重新启动系统。如果问题仍然存在,请找到一种方法来终止在该端口上运行的进程。


-1
对于Windows用户,按照以下步骤操作:
  • 以管理员权限打开命令提示符。

  • 执行以下命令停止“winnat”服务:

    net stop winnat
    
  • 使用以下命令重新启动“winnat”服务:

    net start winnat
    

1
这个答案与已经接受的答案有何不同? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接