¿Cómo solucionar el error: escuchar EADDRINUSE mientras usas NodeJS?
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();
Lo que realmente me ayudó fue:
killall -9 node
Pero esto matará un proceso del sistema.
Con
ps ax
puedes comprobar si funcionó.
EADDRINUSE
significa 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 listening
evento 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);
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 -9
puede 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 -9
un 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.