Node.js Port 3000 ya está en uso pero en realidad no lo está?

115

He estado trabajando con un proyecto de node.js durante algunas semanas y ha funcionado muy bien. Por lo general, utilizo npm startpara ejecutar mi aplicación y verla en un navegador en localhost, puerto 3000.

Hoy, comencé a recibir el siguiente error al usar npm start:

Server started on port 3000                                                                                                                                                                                         
Port 3000 is already in use 

He comprobado el monitor de recursos y no tengo ningún otro proceso ejecutándose en el puerto 3000. ¿Por qué recibiré este mensaje de error?

En mi app.js tengo el siguiente código para configurar el puerto ... ¿es incorrecto? Funcionó bien antes, así que no estoy seguro de qué estoy haciendo mal.

// Set Port
app.set('port', (process.env.PORT || 3000));
app.listen(app.get('port'), function() {
    console.log('Server started on port '+app.get('port'));
});

¡Gracias por la ayuda!


EDITAR:

Intenté ejecutar netstat y TCPView para verificar qué proceso está usando el puerto, pero no hay nada usando ese puerto. También intenté reiniciar mi computadora portátil, pero sigo recibiendo el mismo error.

usuario2573690
fuente
Hay otro proceso que usa este puerto, es seguro. ¿Qué sistema operativo estás intentando? Puede buscarlo en Google como 'encontrar qué puerto utiliza prosess' para su sistema operativo
tanaydin
1
El favicon se almacenará en caché. También puede intentarlo netstaten un símbolo del sistema o conectarse a localhost: 3000 con un equivalente de telnet, PuTTY, por ejemplo.
Blorgbeard sale el
5
Observo que aparece "El puerto 3000 ya está en uso" después de "El servidor se inició en el puerto 3000". ¿Hay algo en su aplicación que intenta comenzar a escuchar nuevamente en el mismo puerto?
Blorgbeard sale el
6
Supongo que tiene dos app.listen()declaraciones en su aplicación en otra .listen()que también está intentando iniciar un servidor en ese puerto. El primero funciona, el segundo informa del error. Busque su código .listen.
jfriend00

Respuestas:

269

Puede buscar cómo eliminar ese proceso.

Para Linux / Mac OS, busque (sudo) runesto en la terminal:

$ lsof -i tcp:3000
$ kill -9 PID

En Windows:

netstat -ano | findstr :3000
tskill typeyourPIDhere 

cambio tskillpara taskkillen git bash

Animesh Singh
fuente
2
Probé varias otras soluciones en Windows, pero esta encontró el proceso extraño que estaba acaparando el puerto. Obtuvo un voto a favor por incluir también el enfoque de Linux además de trabajar en Windows.
truedat101
2
tskill no me funcionó en Windows. taskkill / F / PID myPIDhere - esto funciona
snersesyan
2
No obtengo nada con solo lsofpero con sudo lsof algo, y matar ese proceso resolvió este problema.
user985366
¿Hay alguna forma de obtener dinámicamente el PID para el proceso en ejecución y eliminarlo? Por alguna razón, tengo que hacer esto cada vez que implemento para prod manualmente. Nota al margen, seguro si esto está relacionado con PM2 o ​​no.
S_W
taskkill no me funcionó en git-bash, pero tskill sí. Gracias.
nickcamillo
34

A veces sucede, como propuso @sova. A mí me pasa a veces, EADDR en uso. Por lo general, hay una ventana de terminal oculta en segundo plano que aún ejecuta la aplicación. Y eso también está bien para mí.

Sucede, cuando ha abierto la terminal durante mucho tiempo, sí, tiene derecho, tiene que detener el proceso. Pero a veces no se detuvo en segundo plano. Así que la mejor solución es cerrar la terminal y volver a iniciarla. Resolverá tu problema. porque en mi caso funciona.

También,

sudo lsof -i:<PORT_NO>

cierra la instancia por tiempo presente pero no puede detener el proceso en segundo plano. Así que por una vez

sudo kill <PID>

funciona, pero nuevamente cuando actualizamos nuestro código y guardamos, este problema ocurre nuevamente como con Nodemon .

Así que salir de la terminal solucionará el problema. O

  killall -9 node
techyaura
fuente
2
Ni lsof ni netstat devolvieron nada, sin embargo, todavía parecía haber algún proceso utilizando el puerto. Después de killall -9 nodeque pude ejecutar el servidor localmente.
Julsteri
gracias por el comando killall -9 node. funcionó en goorm IDE
ifhy
24

Quizás puedas tomar esto como referencia. Esta única línea de comando puede matar el proceso que se ejecuta en un puerto determinado.

npx kill-port 3000

ingrese la descripción de la imagen aquí


Para matar varios puertos.

npx kill-port 3000 8080 4200
Penny Liu
fuente
22

Para Windows, el Administrador de tareas definitivamente mostraría un proceso de nodo en ejecución. Intente matar el proceso, resolverá el problema.

PRAKASH THOMAS VARGHESE
fuente
22

Yo tuve el mismo problema. (Los pasos siguientes funcionan bien en Windows 10):

  1. Abra el administrador de tareas (presione Ctrl+ Alt+ Delete)
  2. Seleccione la 'pestaña Procesos'
  3. Busque 'Node.js: JavaScript del lado del servidor'
  4. Selecciónelo y haga clic en el botón 'Finalizar tarea'

Ahora puedes correr npm start.

Espero que te ayude.

Mahyar
fuente
7

He visto lo mismo y he probado todas las sugerencias anteriores sin éxito. Estos son los pasos que lo resuelven por mí: - apague el wifi - npm start (esto debería funcionar) - encienda el wifi

No estoy exactamente seguro de cuál es el problema raíz, pero eso lo resolvió para mí.

James Smith
fuente
También me pasó esto a mí. netstat -anono enumeró nada usando el puerto 3000.
Nathan
Santo cielo, esto también lo resolvió para mí, ya que obviamente no se estaba ejecutando nada en el puerto 3000. Comencé a tener este problema después de una actualización de Windows. Nunca pensé en apagar el WiFi. Gracias por resolver esto :)
3 de
7

Matar a un proceso que posee el puerto 3000

Primero, echemos un vistazo a cómo podemos matar un proceso que tiene un puerto abierto.

Usando el comando lsof, podemos recuperar el PID que tiene el puerto dado:

$ lsof -i :3000 -t
12345

Entonces podemos matar este proceso simplemente haciendo:

$ kill 12345

Convirtamos esto en una sola línea:

lsof -i 3000 -t | xargs kill

Si está utilizando una variable de entorno para configurar el puerto del servidor, podemos especificar eso en lugar de codificar nuestros valores:

lsof -i ${PORT} -t | xargs kill

Por último, podemos usar el puerto 3000 por defecto si la variable de entorno no está configurada:

lsof -i ${PORT:-3000} -t | xargs kill

Conseguir que nodemon ejecute hooks

Nodemon le permite configurar enlaces de eventos a través del archivo de configuración nodemon.json:

{
  "events": {
    "crash": "sh -c 'lsof -i :${PORT:-3000} -t | xargs kill'"
  }
}

Esto hará que nodemon ejecute el comando sh -c 'lsof -i: ${PORT:-3000} -t | xargskill cada vez que su aplicación se bloquee, matando así el proceso hijo que generó y que mantiene el puerto abierto.

o puedes probar este

fuser -k PORT-NO/tcp

p.ej:

fuser -k 3000/tcp
Afeesudheen
fuente
Esta es una solución bastante agradable y limpia para matar un proceso. ¡Tengo que ver cómo hacer esto cada vez, y esta es la mejor solución que he visto hasta ahora!
twknab
Estoy experimentando este problema aunque no regresan procesos de lsof -i :3000 -t= \
xaunlopez
@xaunlopez prueba este fuser -k port-number/tcp
Afeesudheen
6

Estaba usando el servidor express con nodemon en NodeJS. Recibí el siguiente mensaje y parece un error:

$ node ./bin/www
Port 3000 is already in use

Existe una solución general que, si finaliza todas las conexiones del servidor de nodo, puede agregar este código en su archivo package.json:

"scripts": {
    "start": "node ./bin/www",
    "stop": "taskkill -f -im node.exe"
},

Además, he encontrado varias soluciones de comandos de Windows y bash en Win 10 x64.

Todas mis notas están aquí:


# Terminar todas las conexiones del servidor NodeJS

$ taskkill -f -im node.exe
SUCCESS: The process "node.exe" with PID 14380 has been terminated.
SUCCESS: The process "node.exe" with PID 18364 has been terminated.
SUCCESS: The process "node.exe" with PID 18656 has been terminated.

# Ejemplo: abra el Administrador de tareas de Windows y vea el número PID "node.exe" en Windows

>> Command Line
$ netstat /?
$ netstat -a -n -o
$ netstat -ano

# Mata un proceso en Windows por número de puerto (ejemplo)

Para ayuda:

$ taskkill /?
$ tskill /?

Codigo 1:

$ taskkill -pid 14228
ERROR: The process with PID 14228 could not be terminated.
Reason: This process can only be terminated forcefully (with /F option).

Codigo 2:

$ taskkill -f -pid 14228
SUCCESS: The process with PID 14228 has been terminated.

Codigo 3:

$ tskill 14228

# Línea de comando para mirar un puerto específico

en cmd:

$ netstat -ano | find "14228"

en bash:

$ netstat -ano | grep "14228" or $ netstat -ano | grep 14228

# Encuentra node.exe usando el comando "lista de tareas"

en cmd:

$ tasklist | find "node"

en bash:

$ tasklist | grep node
$ tasklist | grep node.exe
node.exe                     14228 Console                    2     48,156 K
node.exe                     15236 Console                    2     24,776 K
node.exe                     19364 Console                    2     24,428 K
aygunyilmaz
fuente
5

Esto me pasa a veces, EADDR en uso. Por lo general, hay una ventana de terminal oculta en segundo plano que aún ejecuta la aplicación. Puede detener el proceso con ctrl + C en la ventana de terminal.

O tal vez esté escuchando el puerto varias veces debido a copy / pasta =)

sova
fuente
¡Gracias por la ayuda! No tengo ninguna otra ventana de terminal abierta, ¿hay algo más que deba comprobar?
user2573690
encuentre cualquier nodo o proceso npm y finalícelo. Si todavía tiene un problema, reinicie la máquina o simplemente elija un puerto diferente para trabajar. Realmente no hay razón para que deba ser el puerto 3000 u 8080
sova
Acabo de crear una nueva aplicación de nodo y la inicié en el puerto 3000 y esa parece funcionar bien, pero cuando intento ejecutar mi proyecto existente, dice que el puerto está en uso. ¿Alguna vez ha tenido este problema?
user2573690
@ user2573690 no me he encontrado con eso antes, pero tal vez tenga varios archivos js (como un app.js y un index.js) donde uno está llamando .listen()varias veces.
sova
2
¡Gracias! Me las arreglé para resolverlo, estaba escuchando el puerto varias veces, ¡accidente de copia / pasta! Si puede editar su respuesta y agregar esa pieza, la marcaré. ¡Una vez más, gracias!
user2573690
5

Abra el Administrador de tareas (presione Ctrl + Alt + Supr. Seleccione la pestaña 'Procesos'. Busque 'Node.js: JavaScript del lado del servidor'. Selecciónelo y haga clic en el botón 'Finalizar tarea'.

Omar bakhsh
fuente
2

Vino de Google aquí con una solución para High Sierra.

Algo cambió en la configuración de red de macos y algunas aplicaciones (incluido ping) no pueden resolver localhost.

Editar / etc / hosts parece una solución:

cmd: sudo nano /etc/hosts/ contenido127.0.0.1 localhost

O simplemente (si está seguro de que su / etc / hosts está vacío) sudo echo '127.0.0.1 localhost' > /etc/hosts

sznowicki
fuente
2

Pasé 2 horas para averiguar por qué EADDRINUSEno me permitía iniciar una aplicación (otros servidores de node-express estaban bien) ... comenzó a funcionar después de agregar lazyConnect: true, a la configuración de la fuente de datos.

No me preguntes por qué ayudó. Yo no sé. Estoy poniendo esta información aquí solo para personas que tienen el mismo problema.

test30
fuente
votó a favor por la voluntad de ayudar Y una solución que pueda ayudar a encontrar la causa raíz.
Titou
2

Tengo este problema al usar Git Bash en Windows. Yo corro npm start, o node app.js. Después de terminarlo con Ctrl + C en breve e intentar iniciar el servidor nuevamente usando npm starto node app.jsluego aparece este mensaje de error.

Sin embargo, cuando hago esto con el símbolo del sistema de Windows normal , funciona bien.

O puedes hacerlo de otra manera. Abra el Administrador de tareas y busque la fila " Node.js: JavaScript del lado del servidor ". Seleccione eso y finalice la tarea . Debería funcionar ahora.

Gracias.

Amanullah Aman
fuente
2

Si desea cerrar solo un puerto, simplemente ejecute este comando. kill -9 $(lsof -t -i:3000)

La diferencia entre pkilly killes que alguien procese arcilla. En matar aplicas un filtro. simplemente detenga el puerto que desee.

El pkillcomando cierra todos los procesos del nodo. pkill -9 node

Use pkill para evitar pérdidas de memoria que ocurren ocasionalmente durante el desarrollo. si hay más de un nodo, los mata a todos.

También se ejemplifica el uso de scripts en package.json .

"scripts": {
    "server:start": "cd server && yarn start",
    "server:restart": "cd server && yarn restart",
    "frontend:start": "cd frontend && yarn start",
    "frontend:restart": "kill -9 $(lsof -t -i:4200) && yarn start:frontend"
},
"scripts": {
    "start": "nodemon --watch 'src/**/*.ts' --ignore 'src/**/*.spec.ts' --exec 'ts-node' src/index.ts",
    "restart": "pkill -9 node && start",
    "kill": "pkill -9 node"
},
umutyerebakmaz
fuente
1

Intente abrir localhost en su navegador. Simplemente escriba: localhost:3000en la barra de direcciones.

Si la aplicación se abre, significa que la anterior npm runtodavía está activa. Ahora, puede hacer cambios en el código y ver los efectos si está diseñando la misma aplicación, o si quiere ejecutar otra aplicación, simplemente modifique el código (en index.js de la aplicación que se estaba ejecutando anteriormente) un poco y ( probablemente actualice la pestaña del navegador) para que se bloquee;) ..... Ahora vuelva a ejecutar npm run startdesde su nuevo directorio de aplicaciones. ¡Espero que esto ayude! :)

o

Puede abrir el Administrador de tareas (WINDOWS_KEY + X> Administrador de tareas) y verá la fila "Node.js: JavaScript del lado del servidor". Seleccione eso y finalice la tarea ... ¡¡Debería funcionar ahora !!



De lo contrario, cambie el .envarchivo de su aplicación para incluir port:3002y ejecutar la nueva aplicación. Esto le permitirá ejecutar dos aplicaciones separadas en diferentes puertos. ¡¡Salud!!

Mohit Singh
fuente
1

Para el usuario de Windows, simplemente detenga todos los procesos de Node.js en el Administrador de tareas

Espero que ayude

Muhammad Ashfaq
fuente
1

Simple en linux

  • Abre tu terminal
  • Puerto libre de procesos -> kill $ (lsof -t -i: $ port)
Oben Desmond
fuente
1

También encontré el mismo problema. La mejor forma de resolverlo es (para Windows) :

  1. Vaya al Administrador de tareas .

  2. Desplácese y busque un proceso de tarea llamado. Node.js: JavaScript del lado del servidor Imagen agregada para referencia

  3. Termina esta tarea en particular.

¡Ahí tienes! ¡Ahora inicie npm y funcionará como antes!

Daim_Nickel_Penny
fuente
0

Para los usuarios de Windows, puede usar la herramienta CurrPorts para eliminar los puertos en uso fácilmente

ingrese la descripción de la imagen aquí

Zuhair Taha
fuente
0

Puede ser un proceso de administración que se ejecuta en segundo plano y netstatno muestra esto.
Use tasklist | grep nodepara encontrar el PID de este proceso de administración y luegokill PID

tnoel999888
fuente
0

si está utilizando webstorm, asegúrese de que su puerto predeterminado no sea 3000 desde el archivo -> configuración -> compilación, ejecución, implementación -> depurador y cambie

Puerto de servidor integrado

y configúrelo en "63342" o vea esta respuesta Cambiar el puerto de WebStorm LiveEdit (63342)

Muhammad Saleh
fuente
0

En los scripts de package.json se incluyen:

"start": "nodemon app.js --delay 1500ms"

Creo que el problema fue para mí el momento en que el puerto anterior no se cerró a tiempo por nodemon para el reinicio. Experimenté el problema al usar multer.

Kalkhas
fuente
Ajuste la demora según sea necesario.
Kalkhas
0

Los métodos listen () del servidor o de la aplicación se pueden agregar en 2 lugares. Busque los métodos listen () en los inicios de la aplicación, por eso regresa cuando el servidor comenzó en el puerto XXXX y el puerto XXXX ya está en uso, el mensaje viene uno al lado del otro

Anoop George
fuente
0

En mi circunstancia, acababa de comenzar a usar VS Code y había seguido un tutorial usando Sequelize. Al final, tenía un archivo bin / www que tenía el listen () allí. No sabía sobre esto y estaba ejecutando mi aplicación ejecutando el nodo app.js, cuando no funcionó, agregué las cosas del servidor expreso con .listen () (que funcionó bien).

Pero cuando comencé a usar nodemon y VSCode, se apuntó a bin / www y eso requirió mi app.js.

Para resumir, agregué .listen () a mi app.js y estaba ejecutando app.js directamente cuando no debería haber agregado eso y ejecutar bin / www.

Pedro
fuente
0

En ubuntu, primero tome el proceso usando el número de puerto: sudo lsof -i: 3000 luego use el comando kill para matar el proceso, por ejemplo, si el PID del proceso es 4493 el comando use: kill 4493 , para mac o windows busque el comando relacionado

ingrese la descripción de la imagen aquí

Señor
fuente
0

He resuelto este problema porque MongoDB o hay otra aplicación que la había ejecutado antes en este puerto, así que para resolverlo, elimine el proceso desde el administrador de tareas, o simplemente cambie el número del puerto de 3000 a cualquier otro.

Omar Abusabha
fuente
0

Es muy simple. Puede solucionarlo en 2 sencillos pasos.

  1. Verifique sus variables de entorno si hay una clave / entrada con el nombre "PORT".
  2. Si lo encuentra, elimine esa entrada o cámbiele el nombre a otra cosa.

Resulta que algún otro programa está usando esa variable. Por lo general, cuando inicia react-scripts, buscará una variable de entorno con ese título PORT.

Amini-Philips Ogelenye
fuente
-1

Antes de ejecutar nodemon, inicie mongod primero. Nunca obtendrá este error. :)

Pratiksha
fuente
-2

verifique si hay algún proceso que se esté ejecutando en el mismo puerto ingresando el comando:

sudo ps -ef

Puede encontrar el proceso que se ejecuta en el puerto de nodo respectivo, luego matar el nodo por

kill -9 <node id>

Si el problema persiste, simplemente elimine todos los nodos

killall node
Mahaveer
fuente
-3

Mata todos los puertos en ejecución (mac):

killall node
Ryan Dhungel
fuente