EADDRINUSE se lanza en Node.js cuando un servidor intenta vincularse a un puerto que ya está ocupado por otro proceso. El sistema operativo solo permite que un proceso escuche en un puerto dado a la vez.
Por qué ocurre
- •Una instancia anterior del mismo proceso servidor no terminó correctamente y sigue ocupando el puerto.
- •Una aplicación diferente (una base de datos, otro servidor de desarrollo, un proxy) ya está escuchando en ese puerto.
- •El hot-reload o el modo watch reinició el proceso antes de que el socket TCP anterior se liberara completamente.
- •Ejecutar múltiples conjuntos de tests o instancias de servidor en paralelo sin asignar puertos diferentes.
Ejemplos
Código que causa el error
const http = require("http");
const server = http.createServer((req, res) => {
res.end("Hello");
});
server.listen(3000, () => console.log("Listening on port 3000"));Error en la terminal
Error: listen EADDRINUSE: address already in use :::3000
at Server.setupListenHandle [as _listen2] (node:net:1739:16)Cómo solucionarlo
Encuentra y elimina el proceso que usa el puerto: lsof -i :<puerto> en macOS/Linux, o netstat -ano | findstr :<puerto> en Windows. Usa una variable de entorno para el número de puerto para que diferentes entornos puedan usar puertos distintos. Agrega un manejador de errores en el objeto servidor para fallar con un mensaje claro en lugar de un crash no manejado.
Código corregido
const http = require("http");
const PORT = process.env.PORT || 3000;
const server = http.createServer((req, res) => {
res.end("Hello");
});
server.on("error", (err) => {
if (err.code === "EADDRINUSE") {
console.error(`Port ${PORT} is in use. Kill the process or use a different port.`);
process.exit(1);
}
});
server.listen(PORT, () => console.log(`Listening on port ${PORT}`));Errores relacionados
¿Listo para practicar tu inglés en el trabajo?
Lingua-e tiene ejercicios interactivos basados en conversaciones reales de developers: standups, code reviews, retrospectivas y más. Practica hasta que salga solo.
Prueba Lingua-e gratis