- Published on
Node.js EACCES error when listening on some ports
- Authors
- Name
- adyingdeath
- @adyingdeath
Today, I was working on one of my projects(a Next.js site) and got the following error when I tried to start the program:
⨯ Failed to start server
Error: listen EACCES: permission denied 0.0.0.0:3000
at <unknown> (Error: listen EACCES: permission denied 0.0.0.0:3000)
at new Promise (<anonymous>) {
code: 'EACCES',
errno: -4092,
syscall: 'listen',
address: '0.0.0.0',
port: 3000
}
I was originally thinking that the port was already in use, so I checked if it was and then found that it wasn't.
After some research, I figured out how to fix it.
Solution
Note: The solution is from a StackOverflow post.
Running locally (Mac OS, Linux)
As a general rule, processes running without root privileges cannot bind to ports below 1024.
So try a higher port, or run with elevated privileges via sudo
. You can downgrade privileges after you have bound to the low port using process.setgid
and process.setuid
.
Running locally (Windows)
It's possible another process is already listening on this port, or the ports have been added to an excluded range.
To show excluded ranges
> netsh interface ipv4 show excludedportrange protocol=tcp
To remedy, either choose another port, or you can try to release the ranges by restarting the winnat
service.
Run cmd
with admin rights.
> net stop winnat
> net start winnat
Running on PaaS (eg: heroku)
When running your apps on most platform as a service offerings, you have to use the port as specified in the PORT environment variable.
See http://devcenter.heroku.com/articles/node-js for an example
const server = require('http').createServer();
const port = process.env.PORT || 3000;
server.listen(port, () => console.log(`Listening on ${port}`));