Error de Node.js EACCES al escuchar en la mayoría de los puertos

Resuelto jwegner asked hace 12 años • 38 respuestas

Estoy probando una aplicación (espero que se ejecute en heroku, pero también tengo problemas a nivel local). Me da un error EACCES cuando ejecuta http.Server.listen(), pero solo ocurre en algunos puertos.

Entonces, localmente estoy ejecutando:

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)

No tengo nada ejecutándose en el puerto 900 (ni en ninguno de los otros 20 puertos que he probado), así que esto debería funcionar. Lo extraño es que funciona en algunos puertos. Por ejemplo, el puerto 3000 funciona perfectamente.

¿Qué causaría esto?

Actualización 1:

Descubrí que en mi computadora local, el error EACCES aparece porque tengo que ejecutar el nodo como root para poder vincularme a esos determinados puertos. No sé por qué sucede esto, pero usar sudo lo soluciona. Sin embargo, esto no explica cómo lo solucionaría en Heroku. No hay forma de ejecutar Heroku como root, entonces, ¿cómo puedo escuchar en el puerto 80?

jwegner avatar Feb 07 '12 01:02 jwegner
Aceptado

Ejecutando en su estación de trabajo

Como regla general, los procesos que se ejecutan sin privilegios de root no pueden vincularse a puertos inferiores a 1024.

Pruebe con un puerto superior o ejecútelo con privilegios elevados a través de sudo. Puede degradar los privilegios después de haberse vinculado al puerto bajo usando process.setgidy process.setuid.

corriendo en heroku

Al ejecutar sus aplicaciones en heroku, debe usar el puerto como se especifica en la variable de entorno PORT.

Ver 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}`));
Ben Taber avatar Feb 06 '2012 19:02 Ben Taber

#Windows

Otra razón: tal vez su puerto haya sido excluido por alguna razón.

Entonces, intente abrir CMD (línea de comando) con derechos de administrador y ejecute:

  1. net stop winnat
  2. net start winnat

ingrese la descripción de la imagen aquí

En mi caso fue suficiente.

La solución se encuentra aquí: https://medium.com/@Bartleby/ports-are-not-available-listen-tcp-0-0-0-0-3000-165892441b9d

Nigrimmist avatar Jan 13 '2021 08:01 Nigrimmist

El usuario sin privilegios (no root) no puede abrir un socket de escucha en puertos inferiores a 1024.

akuz avatar Mar 30 '2012 16:03 akuz

Consulte este enlace de referencia :

Otorgue permiso de usuario seguro para usar el puerto 80

Recuerde, NO queremos ejecutar sus aplicaciones como usuario root, pero hay un problema: su usuario seguro no tiene permiso para usar el puerto HTTP predeterminado (80). Su objetivo es poder publicar un sitio web que los visitantes puedan utilizar navegando a una URL fácil de usar como http://ip:port/

Desafortunadamente, a menos que inicie sesión como root, normalmente tendrá que usar una URL como http://ip:port- donde el número de puerto > 1024.

Mucha gente se queda estancada aquí, pero la solución es fácil. Hay varias opciones pero esta es la que me gusta. Escriba los siguientes comandos:

sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``

Ahora, cuando le diga a una aplicación Node que desea que se ejecute en el puerto 80, no se quejará.

Meet Mehta avatar Apr 24 '2014 23:04 Meet Mehta