¿Cómo solucionar el error: escuchar EADDRINUSE mientras usas NodeJS?

Resuelto Danny Fox asked hace 12 años • 45 respuestas

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 realizar una solicitud mientras ejecuto un servidor en el puerto 80? Para los navegadores web no es un problema: puedo navegar por Internet mientras el servidor está funcionando.

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 petición:

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 avatar Mar 28 '12 05:03 Danny Fox
Aceptado

Lo que realmente me ayudó fue:

killall -9 node

Pero esto matará un proceso del sistema.

Con

ps ax

puedes comprobar si funcionó.

Patrick avatar Apr 19 '2013 14:04 Patrick

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

Entonces, en su caso, ya debe haber un servidor ejecutándose 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.

Deberías 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 avatar Mar 27 '2012 22:03 stewe

Lo mencionado anteriormente 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 desees apuntar a un solo proceso en lugar de eliminar ciegamente todos los procesos activos.

En ese caso, primero obtenga el ID del proceso (PID) del proceso que se ejecuta en ese puerto (por ejemplo, 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 simplemente hazlo (ps, en realidad no lo hagas . Sigue leyendo a continuación):

kill -9 57385

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

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

Generalmente, debes usar kill -15 antes de kill -9 para darle al proceso objetivo la oportunidad de limpiarse después de sí mismo. (Los procesos no pueden detectar o ignorar SIGKILL, pero sí pueden detectar SIGTERM, y a menudo lo hacen). 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 finalices el proceso anterior con:

kill -15 57385

EDITAR 2 : Como se señaló en un comentario por aquí, muchas veces este error es consecuencia de no salir de un proceso correctamente. Eso significa que mucha gente sale de un comando de nodo (o cualquier otro) usando CTRL+Z . La forma correcta de detener un proceso en ejecución es emitir 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 tener que interrumpirlo usted mismo antes de poder volver a ejecutarlo.

Aurelio avatar May 11 '2015 09:05 Aurelio