javascript - Cómo corregir un error: escucha EADDRINUSE mientras usas nodejs?
node.js (30)
Motivo del error: está intentando utilizar el
port number
ocupado
Hay dos opciones para resolver este problema en Windows / Mac
- Número de puerto utilizado actualmente libre
- Seleccione otro número de puerto para su programa actual
1. Número de puerto libre
Windows
1. netstat -ano | findstr :4200
2. taskkill /PID 5824 /F
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, Mac
usuarios de Mac
pueden consultar la discusión completa sobre este problema. Encontrar (y eliminar) el proceso de bloqueo del puerto 3000 en Mac.
2. ¿Cambiar número de puerto?
Windows
set PORT=5000
Mac
export PORT=5000
Si ejecuto un servidor con el puerto 80 e intento usar xmlHTTPrequest 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 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();
sudo kill $ (sudo lsof -t -i: 80)
por la fuerza de matar
sudo kill -9 $ (sudo lsof -t -i: 80)
use el cmd anterior para matar un puerto en particular y luego ejecute su servidor
** ANTES DE DOBLARSE - LEA la respuesta. ¡ES RELEVANTE! Si vas a bajar esto, deja un comentario por qué crees que no es relevante.
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 el puerto 80 (Desmarque esto)
Al matar el NODE_PORT, podría matar el proceso de Chrome o cualquier cosa que escuche 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
Debe intentar matar el proceso que está escuchando en el puerto 80.
Killall matará a todas las aplicaciones de nodo en ejecución. Puede 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
Dos servidores no pueden escuchar en el mismo puerto, así que revisa si otro servidor escucha en el mismo puerto, también revisa la sincronización del navegador si se está ejecutando en el mismo puerto
El killall -9 node
mencionado anteriormente, sugerido por Patrick funciona como se espera y resuelve el problema, pero es posible que desee leer la parte de edición de esta respuesta sobre por qué kill -9
puede 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 (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 haz (ps - en realidad no . Sigue leyendo a continuación):
kill -9 57385
Puedes leer un poco más sobre esto here .
EDITAR: Estaba leyendo sobre un tema bastante relacionado hoy y me topé con este interesante hilo sobre por qué no debería kill -9
un proceso .
En general, debe usar kill -15 antes de kill -9 para darle al proceso objetivo la posibilidad de limpiar después de sí mismo. (Los procesos no pueden atrapar o ignorar a SIGKILL, pero pueden atrapar SIGTERM). Si no le da al proceso la oportunidad de terminar lo que está haciendo y limpiar, puede dejar los archivos corruptos (u otro estado) alrededor. que no podrá entender una vez reiniciado.
Por lo tanto, como se indica, es mejor que mates el proceso anterior con:
kill -15 57385
EDIT 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 muchas personas salen 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 preocuparse de matarlo usted mismo antes de poder volver a ejecutarlo.
El error EADDRINUSE
(dirección ya en uso) informa que ya hay otro proceso en el sistema local que ocupa esa dirección / puerto.
Hay un paquete npm llamado find-process que ayuda a encontrar (y cerrar) el proceso de ocupación.
Aquí hay un pequeño código de demostración:
const find = require(''find-process'')
const PORT = 80
find(''port'', PORT)
.then((list) => {
console.log(`Port "${PORT}" is blocked. Killing blocking applications...`)
const processIds = list.map((item) => item.pid)
processIds.forEach((pid) => process.kill(pid, 10))
})
Preparé una pequeña muestra que puede reproducir el error EADDRINUSE
. Si ejecuta el siguiente programa en dos terminales separados, verá que el primer terminal iniciará un servidor (en el puerto "3000") y el segundo terminal cerrará el servidor que ya se está ejecutando (porque bloquea la ejecución del segundo terminal, EADDRINUSE
):
Ejemplo de trabajo mínimo:
const find = require(''find-process'')
const http = require(''http'')
const PORT = 3000
// Handling exceptions
process.on(''uncaughtException'', (error) => {
if (error.code === ''EADDRINUSE'') {
find(''port'', PORT)
.then((list) => {
const blockingApplication = list[0]
if (blockingApplication) {
console.log(`Port "${PORT}" is blocked by "${blockingApplication.name}".`)
console.log(''Shutting down blocking application...'')
process.kill(blockingApplication.pid)
// TODO: Restart server
}
})
}
})
// Starting server
const server = http.createServer((request, response) => {
response.writeHead(200, {''Content-Type'': ''text/plain''})
response.write(''Hello World!'')
response.end()
})
server.listen(PORT, () => console.log(`Server running on port "${PORT}"...`))
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
En mi caso uso un alojamiento web pero es el mismo que en un host local, usé:
ps -aef | grep ''node''
Para ver el proceso del nodo, la consola muestra el proceso con PID. para matar el proceso tienes que usar este comando:
kill -9 PID
donde PID es el ID de proceso del comando anterior.
En mi caso, el servidor HTTP Apache 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 tu Mac;
- Puedes comprobarlo con
sudo lsof -i tcp:8080
- Si la
sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
es Sí y desea detener a Jenkins solo una vez, ejecute:sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
Este error se produce cuando ejecuta cualquier proceso 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 : ESCUCHAR 26869 / nodo
Ahora puedes matar ese proceso sudo kill -9 26869
Esto funciona para mí (estoy usando mac). Ejecuta este comando
lsof -PiTCP -sTCP:LISTEN
Esto mostrará una lista de puertos que está usando su sistema. Encuentra el PID
que tu nodo 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 ejecute kill -9 [YOUR_PID]
He visto este error antes (en nodo) con http.client y, según recuerdo, el problema tenía que ver con no inicializar httpClient o configurar malas opciones en la creación de httpClient y / o en la solicitud de URL.
La opción que me está funcionando:
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
Lo que realmente me ayudó fue:
killall -9 node
Pero esto matará un proceso del sistema.
Con
ps ax
Puede comprobar si funcionó.
Otra cosa que puede dar este error, es 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, desencadenó este error.
Para los usuarios de Windows, ejecute el siguiente comando en la ventana de PowerShell para eliminar todos los procesos del nodo.
Stop-Process -processname node
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 hacer funcionar a killall
... así que
- Abra su administrador de tareas
- En la pestaña de procesos, haga clic derecho en Nombre o en cualquier columna y seleccione para incluir PID
- 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, encontrar el motor Node y simplemente finalizarlo.
Para su información, estaba usando Visual Studio Code para ejecutar Node en el puerto 3500, y uso el shell de 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 esto funcionó. Esperemos que ayude a los demás. De lo contrario es documentación para mi.
Parece que hay otro proceso de Node ng serve en ejecución. Compruébelo escribiendo esto en su consola (Linux / Mac):
ps aux|grep node
y lo dejó con:
kill -9 <NodeProcessId>
O alternativamente, el uso
ng serve --port <AnotherFreePortNumber>
para servir su proyecto en un puerto libre de su elección.
Prefiero hacer
killall -15 node
porque, kill -15
le da al proceso la posibilidad de limpiarse. Ahora, puedes verificar por
ps aux | grep node
Nota: Si no le da al proceso la oportunidad de terminar lo que está haciendo y limpiar, puede llevar a archivos dañados.
Su aplicación ya se está ejecutando en ese puerto 8080. Usa este código para matar el puerto y ejecuta tu código de nuevo
sudo lsof -t -i tcp:8080 | xargs kill -9
También tengo el mismo problema, y simplemente cierro la terminal, abro una nueva terminal y ejecuto
node server.js
otra vez. 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.
Tuve el mismo problema recientemente.
Significa que el puerto ya está siendo utilizado por otra aplicación (Express u otro software)
En mi caso, accidentalmente ejecuté Express en 2 terminales, por lo que salir de la terminal usando ''Ctrl + C'' me solucionó las cosas. (Ejecutar servidor desde un solo terminal)
Espero que ayude a los demás.
Windows siempre es complicado con el código abierto.
cambiar el puerto simplemente funciona
node-inspector --web-port=8099
si quieres resolver esto
$ node server events.js: 141 thr er; // Evento de ''error'' no manejado ^
Error: escuche EADDRINUSE ::: 3000 en Object.exports._errnoException (util.js: 907: 11) en exports._exceptionWithHostPort (util.js: 930: 20) en Server._listen2 (net.js: 1250: 14) en escuchar (net.js: 1286: 10) en Server.listen (net.js: 1382: 5) en EventEmitter.listen (C: / sendbox / mean / node_modules / express / lib / application .js: 617: 24) en Objeto. (C: / sendbox / mean / server.js: 28: 5) en Module._compile (module.js: 409: 26) en Object.Module._extensions..js (module.js: 416: 10) en Module. carga (module.js: 343: 32)
cambie su número de puerto a 8000
EADDRINUSE
significa que el número de puerto con el que listen()
intenta enlazar el servidor ya está en uso.
Entonces, en su caso, debe estar ejecutando un servidor en el puerto 80 ya.
Si tiene otro servidor web ejecutándose en este puerto, debe colocar node.js detrás de ese servidor y enviarlo por proxy.
Debería verificar el evento de listening
esta manera, 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);
EADDRINUSE
significa que el puerto (que intentamos escuchar en la aplicación del 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 3000 puertos. Necesitamos verificar si ese puerto ya está siendo usado por cualquier otro proceso.
paso 1:
$sudo netstat -plunt |grep :3000
Que el comando anterior da por debajo el resultado.
tcp6 0 0 :::3000 :::* LISTEN 25315/node
paso 2:
Ahora tienes ID de proceso (25315), mata ese proceso.
kill -9 25315
paso 3:
npm run start
Nota: Esta solución para usuarios de linux.
pkill node
antes de ejecutar su script debería hacer el trabajo.
Error: escuchar EADDRINUSE significa que el puerto que desea asignar / enlazar 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 está ejecutando en el puerto deseado.
Para una aplicación de nodo, lo que puede probar es encontrar el ID de proceso para la aplicación de nodo de la siguiente manera:
ps -aux | grep node
Después de obtener la identificación del proceso, hacer
kill process_id