javascript node.js

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

  1. Número de puerto utilizado actualmente libre
  2. 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;

  1. Puedes comprobarlo con sudo lsof -i tcp:8080
  2. 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

  1. Abra su administrador de tareas
  2. En la pestaña de procesos, haga clic derecho en Nombre o en 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, 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