¿Cómo solucionar el error: escuche EADDRINUSE mientras usa nodejs?

466

Si ejecuto un servidor con el puerto 80 e intento usar xmlHTTPrequest, aparece este error:Error: listen EADDRINUSE

¿Por qué es un problema para nodejs, si quiero hacer una solicitud, mientras ejecuto un servidor en el puerto 80? Para los navegadores web no es un problema: puedo navegar en Internet mientras el servidor se está ejecutando.

El servidor es:

  net.createServer(function (socket) {
    socket.name = socket.remoteAddress + ":" + socket.remotePort;
    console.log('connection request from: ' + socket.remoteAddress);
    socket.destroy();
  }).listen(options.port);

Y la solicitud:

var xhr = new XMLHttpRequest();

xhr.onreadystatechange = function() {
    sys.puts("State: " + this.readyState);

    if (this.readyState == 4) {
        sys.puts("Complete.\nBody length: " + this.responseText.length);
        sys.puts("Body:\n" + this.responseText);
    }
};

xhr.open("GET", "http://mywebsite.com");
xhr.send();
Danny Fox
fuente
¿Estás seguro de que options.port se define como 80? ¿Se está ejecutando el código XHR en un navegador? ¿Se puede ejecutar "nc -l 0.0.0.0 80" cuando este servidor no se está ejecutando?
Timothy Meade
Vea un problema similar en stackoverflow.com/questions/8553957/…
Manohar Reddy Poreddy
¿En qué sistema estás? Algunos sistemas requieren sudo si desea escuchar puertos por debajo de cierto umbral.
Kebman
este problema surge porque o bien ejecutó su servidor en ese puerto y no lo había cerrado, el error dice claramente que el puerto ya está en uso, esto me sucede cuando abro un nuevo proyecto en código vs sin cerrar otros proyectos (abrir arrastrar y soltar)
Ashad Nasim

Respuestas:

412

EADDRINUSEsignifica que el número de puerto que listen()intenta vincular el servidor ya está en uso.

Entonces, en su caso, ya debe estar ejecutando un servidor en el puerto 80.

Si tiene otro servidor web ejecutándose en este puerto, debe colocar node.js detrás de ese servidor y utilizarlo como proxy.

Debe verificar el listeningevento como este, para ver si el servidor realmente está escuchando:

var http=require('http');

var server=http.createServer(function(req,res){
    res.end('test');
});

server.on('listening',function(){
    console.log('ok, server is running');
});

server.listen(80);
stewe
fuente
1
Solo ejecuto este servidor. Antes de iniciar el servidor, la xmlhttprequest funciona. Después de iniciar el servidor en el puerto 80, el servidor también funciona perfectamente. Pero si hago una solicitud xmlhttprequest después de iniciar el servidor, aparece este error.
Danny Fox
66
¿Esto todavía no arrojará un error si el servidor ya está escuchando?
trysis
1
Para mí, esto fue causado por Skype
Beep
559

Lo que realmente me ayudó fue:

killall -9 node

Pero esto matará un proceso del sistema.

Con

ps ax

Puedes comprobar si funcionó.

Patricio
fuente
1
Tambien para mi. En mi caso, solo ejecuté la función de escucha dos veces y obtuve el error en el segundo
vabada
2
En una nota relacionada, también puede leer cuándo no debería matar un proceso .
Nobita
12
El problema aquí es que ustedes no están saliendo del proceso de nodo con gracia después de la primera ejecución. Por lo tanto, el nodo todavía está vinculado a ese puerto. ps aux | grep nodedemostraría eso. En lugar de matar a la aplicación con CTRL + Z , salir de la aplicación con CTRL + C . Esto sale de la aplicación con gracia y se elimina el enlace del puerto.
riser101
22
Más de 150 votos positivos para una solución que equivale a golpear su software con un mazo.
LeeGee
1
Esta solución es bastante problemática ya que el indicador -9 matará el proceso sin liberar la memoria. Realmente deberías usar esto solo como una última solución.
Yaki Klein
279

Lo anterior killall -9 node, sugerido por Patrick, funciona como se esperaba y resuelve el problema, pero es posible que desee leer la parte de edición de esta misma respuesta sobre por qué kill -9puede no ser la mejor manera de hacerlo.

Además de eso, es posible que desee apuntar a un solo proceso en lugar de matar ciegamente todos los procesos activos.

En ese caso, primero obtenga el ID de proceso (PID) del proceso que se ejecuta en ese puerto (digamos 8888):

lsof -i tcp:8888

Esto devolverá algo como:

COMMAND   PID    USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node     57385   You   11u  IPv6 0xac745b2749fd2be3      0t0  TCP *:ddi-tcp-1 (LISTEN)

Entonces solo haz (ps - en realidad no . Por favor, sigue leyendo a continuación):

kill -9 57385

Puedes leer un poco más sobre esto aquí .

EDITAR: Estaba leyendo sobre un tema bastante relacionado hoy y me topé con este interesante hilo sobre por qué no debería kill -9un proceso .

En general, debe usar kill -15 antes de kill -9 para darle al proceso objetivo la oportunidad de limpiar después de sí mismo. (Los procesos no pueden detectar o ignorar SIGKILL, pero sí pueden detectar SIGTERM). Si no le da al proceso la oportunidad de terminar lo que está haciendo y limpiar, puede dejar archivos corruptos (u otro estado) alrededor que no podrá entender una vez reiniciado.

Entonces, como se indicó, es mejor que elimine el proceso anterior con:

kill -15 57385

EDITAR 2 : Como se señaló en un comentario por aquí muchas veces, este error es una consecuencia de no salir de un proceso con gracia. Eso significa que, a mucha gente salir de un comando de nodo (o cualquier otro) usando CTRL + Z . La forma correcta de detener un proceso en ejecución es emitiendo el comando CTRL + C que realiza una salida limpia.

Salir de un proceso de la manera correcta liberará ese puerto mientras se apaga. Esto le permitirá reiniciar el proceso sin pasar por la molestia de matarlo usted mismo antes de poder volver a ejecutarlo.

Nobita
fuente
¿Dónde debo ejecutar este comando? En el símbolo del sistema? ¿En la consola NPM?
Ulises Alves
@UlyssesAlves solo abre una ventana de terminal y elimina el proceso desde allí.
Nobita
@Nobita ¿Funciona esto en Windows? Ahora me doy cuenta de que podría ser un comando de MAC OS. De todos modos, reinicié mi PC y ya no recibí este error. Creo que alguna otra aplicación estaba usando el mismo nodo de puerto que estaba tratando de usar.
Ulises Alves
2
pgrep nodemuestra si algún proceso de nodo se te ha escapado. pkill nodelos matará
Josh.F
3
no para Windows, amigos: deben probar con otro puerto o reiniciar la computadora: P
Tom Stickel
62

Solo un aviso, Skype a veces escuchará en el puerto 80 y, por lo tanto, causará este error si intenta escuchar en el puerto 80 desde Node.js o cualquier otra aplicación.

Puede desactivar ese comportamiento en Skype accediendo a las opciones y haciendo clic en Avanzado -> Conexión -> Usar puerto 80 (Desmarque esto)

Desactiva el uso del puerto 80 de Skype

PD: Después de hacer ese cambio, ¡no olvide reiniciar Skype!

Rob Evans
fuente
14
PD: Después de hacer ese cambio, ¡no olvides reiniciar Skype!
Rob Evans
16
Este es uno de los defectos de diseño más asombrosos que he visto. ¿Cómo son los locos Skype proyectos de desarrollo que tendrían nunca considerar la adopción de más de 80 o 443?
AJB
55
Gran +1 para tus habilidades de depuración, Rob.
AJB
@AJB Lo hicieron para intentar atravesar firewalls que limitan el tráfico saliente a las solicitudes http, pero donde los firewalls no están usando DPI, simplemente bloqueen los puertos básicos. Aún así ... ¡es un poco tonto habilitar esto por defecto!
Rob Evans
Sí, eso se me ocurrió después de pensar un poco sobre por qué harían esto. Aún así, un kludge realmente feo. Y la idea de que está habilitada por defecto es simplemente arrogante.
AJB
39

Deberías intentar eliminar el proceso que está escuchando en el puerto 80.

Killall eliminará todas las aplicaciones de nodo que se estén ejecutando. Es posible que no quieras hacer eso. Con este comando puede matar solo la aplicación que está escuchando en un puerto conocido.

Si usa Unix intente este comando:

sudo fuser -k 80/tcp    
Yaki Klein
fuente
1
Gracias Yaki El nodo killall falló para mí, pero esto funcionó.
Pat M
¡Gracias! killall y lsof -i no funcionaron para mí, pero esto sí.
karfus
1
Es posible que no desee eliminar todas las aplicaciones de nodo en ejecución.
Yaki Klein
28

Motivo del error: está intentando utilizar el ocupadoport number

Dos posibles soluciones para Windows / Mac

  1. Número de puerto usado actualmente gratis
  2. Seleccione otro número de puerto para su programa actual


1. Número de puerto libre

Ventanas

1. netstat -ano | findstr :4200
2. taskkill /PID 5824 /F

ingrese la descripción de la imagen aquí

Mac

Puedes probar netstat

netstat -vanp tcp | grep 3000

Para OSX El Capitan y más reciente (o si su netstat no admite -p), use lsof

sudo lsof -i tcp:3000

Si esto no resuelve su problema, los Macusuarios pueden consultar la discusión completa sobre este tema Buscar (y matar) el proceso de bloqueo del puerto 3000 en Mac


2. ¿Cambiar el número de puerto?

Ventanas

set PORT=5000

Mac

export PORT=5000
WasiF
fuente
También puede hacerlo en un comando en Windows:netstat -ona | findstr ".0:PORT +0.0.0.0:0 +LISTENING" | for /f "tokens=5" %t in ('more') do taskkill /PID:%t /f
Z. Khullah
27

En un entorno de controlador, puede usar:

pkill node antes de ejecutar su script debe hacer el trabajo.

Tenga en cuenta que este comando matará todos los nodeprocesos, lo que podría ser correcto si tiene, por ejemplo, un contenedor que ejecuta solo una instancia, nuestro tiene tal envio donde puede garantizarlo.

En cualquier otro escenario, recomiendo usar un comando para eliminar un determinado identificador de proceso o nombre que encontraste buscándolo mediante programación. como si se llama su proceso, nodo-servidor-1 que podría hacer pkill node-server-1.

Este recurso puede ser útil para comprender: https://www.thegeekstuff.com/2009/12/4-ways-to-kill-a-process-kill-killall-pkill-xkill/

Javier Cobos
fuente
2
pgrep nodede node
antemano
1
¡Totalmente !, estaba hablando en caso de que fuera un contenedor o lugar muy controlado para el proceso.
Javier Cobos
Esta es una respuesta increíble que diré que otras proporcionadas anteriormente. Todos, por favor, voten a favor.
Jitendra Pawar
@JavierCobos: si estaba hablando dentro de un contenedor o espacio controlado similar, agregue esa información a la respuesta misma. Muchas personas no se encuentran en tales entornos, especialmente en una máquina de desarrollo, y esto podría tener consecuencias no deseadas tal como están. Voto negativo, pero feliz de cambiar el voto con la aclaración adecuada.
lindes
1
Muchos lo harán ... pero como alguien que pasa mucho tiempo ayudando a capacitar a desarrolladores junior, e incluso más allá de ese contexto, puedo decirte que muchas personas hacen uso de las respuestas en Stack Overflow sin comprender realmente lo que están haciendo. .. solo se enfrentan a un problema, y ​​ven algo representado como una solución a lo que parece ser su problema, y ​​corren con él. Entonces ... personalmente deseo que el sitio dé buenas explicaciones y fomente buenos hábitos generales. Entonces, de ahí es de donde vengo. Sin embargo, sé que no es la única perspectiva. :)
lindes
16

Su aplicación ya se está ejecutando en ese puerto 8080. Use este código para eliminar el puerto y vuelva a ejecutar su código

sudo lsof -t -i tcp:8080 | xargs kill -9
ranjith
fuente
La pregunta hace referencia al puerto 80, no al 8080. Además, si bien esto probablemente funcionaría para deshacerse de un proceso ofensivo en el puerto 8080, el uso kill -9es casi seguro excesivo y, en mi opinión, un horrible consejo para dar sin advertencias específicas sobre eso. Simplemente kill, probablemente el truco, y realmente, el problema fundamental en esta cuestión es, creo, que están tratando de volver a ejecutar un servidor de una y otra vez, así que esto es sólo un truco, no una solución. Necesitan tener una mejor comprensión de lo que está sucediendo, lo que esta respuesta realmente no proporciona.
lindes
15

Otra cosa que puede dar este error, son dos servidores HTTP en el mismo código de nodo. Estaba actualizando algunos códigos Express 2 a Express 3, y tuve esto ...

http.createServer(app).listen(app.get('port'), function(){            
  console.log('Express server listening on port ' + app.get('port')); 
});        

// tons of shit.

http.createServer(app).listen(app.get('port'), function(){            
  console.log('Express server listening on port ' + app.get('port')); 
});                                                                   

Y, provocó este error.

Evan Carroll
fuente
14

Esto funciona para mí (estoy usando mac). Ejecute este comando

lsof -PiTCP -sTCP:LISTEN

Esto mostrará una lista de puertos que está utilizando su sistema. Encuentra el PIDque tu nodo se está ejecutando

COMMAND     PID          USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node      17269 hientrq   16u  IPv6 0xc42959c6fa30c3b9      0t0  TCP *:51524 (LISTEN)
node      17269 hientrq   19u  IPv4 0xc42959c71ae86fc1      0t0  TCP localhost:1337 (LISTEN)

y correr kill -9 [YOUR_PID]

hientrq
fuente
11

EADDRINUSEsignifica que el puerto (que intentamos escuchar en la aplicación de nodo) ya se está utilizando. Para superar, necesitamos identificar qué proceso se está ejecutando con ese puerto.

Por ejemplo, si estamos tratando de escuchar nuestra aplicación de nodo en el puerto 3000. Necesitamos verificar si ese puerto ya está siendo utilizado por algún otro proceso.

paso 1:

$sudo netstat -plunt |grep :3000

Que el comando anterior da el resultado a continuación.

tcp6       0      0 :::3000                 :::*                    LISTEN      25315/node

paso 2:

Ahora tienes el ID de proceso (25315), Mata ese proceso.

kill -9 25315

paso 3:

npm run start

Nota: Esta solución para usuarios de Linux.

Thavaprakash Swaminathan
fuente
9
lsof -i:3000;
kill -9 $(lsof -t -i:3000);
// 3000 is a your port
// This "lsof -i:3000;" command will show PID 
kill PID 
ex: kill 129393
Pramod Jain
fuente
3
Agregue más contexto a sus respuestas para ayudar a los futuros lectores a comprender el código / comando.
Milo
8

sudo kill $ (sudo lsof -t -i: 80)

para matar a la fuerza

sudo kill -9 $ (sudo lsof -t -i: 80)

use el cmd anterior para eliminar un puerto en particular y luego ejecute su servidor

Marla Tarakeswara Rao
fuente
8

Pruebe ambos comandos y detendrá todo el proceso de nodo.

killall 9 node
pkill node
npm start 
Anupam Maurya
fuente
1
este truco me ayudó a ahorrar mucho tiempo gracias
Anoop PS
5

Este error se produce cuando tiene algún proceso ejecutándose en un puerto en el que desea ejecutar su aplicación.

cómo obtener qué proceso se ejecuta en ese puerto => comando: sudo netstat -ap | grep: 3000

salida: obtendrá la información del proceso que está utilizando ese puerto

tcp 0 0 Dirección IP: 3000 : ESCUCHE 26869 / nodo

Ahora puedes matar ese proceso sudo kill -9 26869

WAQAR SHAIKH
fuente
Verificó todas las respuestas. Pero resuelves mi problema.
Rahul
5

En el siguiente comando, reemplace su número de puerto

sudo lsof -t -i tcp:portNumber | xargs kill -9
ramachandrareddy reddam
fuente
5

EADDRINUSE significa que el puerto de su aplicación nodejs ya está en uso.

  • Ahora ha eliminado el proceso / aplicación que se ejecuta en ese puerto.
  • Encuentre la identificación del proceso de la aplicación por:

lsof -i tcp: 3000

  • Ahora obtendrá la identificación del proceso de esto.
  • Ejecuta esto:

kill -9 processId

Sidharth Srivastava
fuente
4

Hay una manera de terminar el proceso usando el Administrador de tareas:

Tenga en cuenta que esta solución es solo para Windows

  1. Vaya al Administrador de tareas (o use el acceso directo Ctrl+ Shift+ Esc)

  2. En "Procesos en segundo plano", busque los procesos "Node.js" y finalícelos (haga clic con el botón derecho en ellos y elija "Finalizar tarea")

ingrese la descripción de la imagen aquí

  1. Ahora deberías poder comenzar de nuevo
Jee Mok
fuente
Para usuarios de mac: 1. Inicie 'Monitor de actividad' 2. Busque 'nodo' en la barra de búsqueda en la parte superior derecha. 3. Haga doble clic en el proceso de nodo y salga. ¡¡¡¡Estas listo!!!! Feliz codificación
Apogee
3

He visto este error antes (en el nodo) con http.client y, según recuerdo, el problema tenía que ver con no inicializar httpClient o establecer opciones incorrectas en la creación de httpClient y / o en la solicitud de URL.

ControlAltDel
fuente
3

También tengo el mismo problema, y ​​simplemente cierro la terminal y abro una nueva terminal y ejecuto

node server.js

de nuevo. eso funciona para mí, en algún momento solo tengo que esperar unos segundos hasta que vuelva a funcionar.

Pero esto solo funciona en una máquina de desarrollador en lugar de una consola de servidor.

robinclark007
fuente
3

Error: escuchar EADDRINUSE significa que el puerto que desea asignar / vincular a su servidor de aplicaciones ya está en uso. Puede asignar otro puerto a su aplicación.

O si desea asignar el mismo puerto a la aplicación. Luego, elimine la aplicación que se ejecuta en el puerto deseado.

Para una aplicación de nodo, lo que puede probar es encontrar la identificación del proceso para la aplicación de nodo:

ps -aux | grep node

Después de obtener la identificación del proceso, haz

kill process_id
Parth Vyas
fuente
-aux en windows 10?
Tom Stickel
No -aux es para sistemas basados ​​en Linux. Para sistemas basados ​​en Windows, puede buscar el sistema de monitoreo para el proceso de nodo deseado y finalizarlo.
Parth Vyas
2

En Debian descubrí que se ejecuta en el puerto 80, debe emitir el comando como root, es decir

sudo node app.js

Espero que ayude

Khurram Ijaz
fuente
2

En mi caso, Apache HTTP Server se ejecutó en el puerto 80. Lo resolví emitiendo el comando como root

sudo killall httpd

Actualizar

Si Jenkin está instalado y ejecutándose en su Mac;

  1. Puedes consultarlo con sudo lsof -i tcp:8080
  2. En caso afirmativo, y desea detener a Jenkins solo una vez, ejecute: sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
Chotala Paresh
fuente
2

Parece que se está ejecutando otro proceso de publicación de nodos. Verifíquelo escribiendo esto en su consola (Linux / Mac):

ps aux|grep node

y salga con:

kill -9 <NodeProcessId>

O uso alternativo

ng serve --port <AnotherFreePortNumber>

para servir su proyecto en un puerto libre de su elección.

Birol Efe
fuente
1

Mientras elimina el NODE_PORT, puede matar su proceso de Chrome o cualquier cosa que esté escuchando en el mismo puerto, y eso es molesto.

Este script de shell puede ser útil; en mi caso, el puerto es 1337, pero puede cambiarlo en cualquier momento

# LOGIC

CHROME_PIDS=`pidof chrome`
PORT_PIDS=`lsof -t -i tcp:1337`

for pid in $PORT_PIDS
do

if [[ ${CHROME_PIDS} != *$pid* ]];then

    # NOT FOUND IN CHROME PIDS

    echo "Killing $pid..."
    ps -p "$pid"

    kill -kill "$pid"
    fi

done

sails lift
# OR 'node app' OR whatever that starts your node

exit
Nizar Blond
fuente
1

En mi caso utilizo un alojamiento web pero es lo mismo en el host local, utilicé:

ps -aef | grep 'node' 

para ver el proceso del nodo entonces, la consola muestra el proceso con PID. para matar el proceso tienes que usar este comando:

kill -9 PID

donde PID es la identificación del proceso del comando anterior.

Jorge Mejia
fuente
1

Dos servidores no pueden escuchar en el mismo puerto, así que verifique si otro servidor escucha en el mismo puerto, también verifique la sincronización del navegador si se está ejecutando en el mismo puerto

blackHawk
fuente
1

Para otras personas en Windows 10 con nodo como localhost y ejecutándose en un puerto como 3500, no 80 ...

Qué no funciona:

killall    ?  command not found
ps -aux | grep 'node'     ?     ps:  user x unknown 

Lo que muestra información pero aún no funciona:

 ps -aef | grep 'node'
 ps ax
 kill -9 61864

¿Qué funciona?

Git Bash o Powershell en Windows

  net -a -o | grep 3500   (whatever port you are looking for) 

Observe el PID (extremo derecho)
No pude llegar killallal trabajo ... así que

  1. Abre tu administrador de tareas
  2. En la pestaña de procesos, haga clic derecho en Nombre o cualquier columna y seleccione para incluir PID
  3. Ordene por PID, luego haga clic derecho en PID derecho y haga clic en finalizar tarea.

Ahora, después de ese ejercicio no tan divertido en Windows, me di cuenta de que puedo usar el administrador de tareas y encontrar el motor Node y simplemente finalizarlo.

FYI, estaba usando Visual Studio Code para ejecutar Node en el puerto 3500, y uso el shell Git Bash dentro del código VS. Había salido con gracia con Ctrl + C, pero a veces esto no lo mata. No quiero cambiar mi puerto o reiniciar, así que funcionó. Ojalá ayude a los demás. De lo contrario, es documentación para mí.

Tom Stickel
fuente
1

Para los usuarios de Windows, ejecute el siguiente comando en la ventana de PowerShell para eliminar todos los procesos de nodo.

Stop-Process -processname node
rawel
fuente
1

La opción que me funciona:

Correr:

ps -ax | grep node

Obtendrás algo como:

 8078 pts/7    Tl     0:01 node server.js
 8489 pts/10   S+     0:00 grep --color=auto node    
 kill -9 8078
tanque de prakash
fuente