Der FehlerFehler: EADDRINUSE abhören: Adresse wird bereits verwendet :::3000 bedeutet, dass ein anderer Prozess bereits den von Ihrer Node.js-App gewünschten Port verwendet. Dies ist einer der häufigsten Fehler während der Entwicklung. Hier finden Sie alle Möglichkeiten, das Problem zu beheben.
📋 Table of Contents
- Was verursacht diesen Fehler
- Fix 1: Den Prozess finden und beenden (macOS/Linux)
- Fix 2: Den Prozess finden und beenden (Windows)
- Fix 3: Einen anderen Port verwenden
- Fix 4: Behandeln Sie den Fehler ordnungsgemäß
- Fix 5: Graceful Shutdown implementieren (verhindert das Problem)
- Fix 6: Verwenden Sie nodemon für saubere Neustarts
- Wiederverwendbares Kill-Port-Skript
- Häufig gestellte Fragen
- Fazit
Was verursacht diesen Fehler
- Eine frühere Serverinstanz wurde nicht ordnungsgemäß heruntergefahren und behält weiterhin den Port
- Eine andere Anwendung verwendet denselben Port (ein anderer Entwicklungsserver, eine andere Datenbank)
- Ein abgestürzter Prozess hinterließ einen Zombie, der den Port
- hielt Sie haben Ihren Server zweimal gestartet
Fix 1: Den Prozess finden und beenden (macOS/Linux)
# Find the process using port 3000
lsof -i :3000
# COMMAND PID USER FD TYPE DEVICE NODE NAME
# node 12345 you 20u IPv6 ... TCP *:3000 (LISTEN)
# Kill it by PID
kill -9 12345
# Or do it in one command
kill -9 $(lsof -ti :3000)
# Kill all node processes (nuclear option)
killall -9 node
Fix 2: Den Prozess finden und beenden (Windows)
# Find the process using port 3000
netstat -ano | findstr :3000
# TCP 0.0.0.0:3000 0.0.0.0:0 LISTENING 12345
# Kill it by PID
taskkill /PID 12345 /F
# PowerShell one-liner
Stop-Process -Id (Get-NetTCPConnection -LocalPort 3000).OwningProcess -Force
Fix 3: Einen anderen Port verwenden
// Make the port configurable via environment variable
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log("Server running on port " + PORT);
});
// Then run with a different port:
// PORT=3001 node server.js
Fix 4: Behandeln Sie den Fehler ordnungsgemäß
const server = app.listen(PORT);
server.on('error', (err) => {
if (err.code === 'EADDRINUSE') {
console.error("Port " + PORT + " busy. Trying " + (PORT + 1));
server.listen(PORT + 1); // fall back to next port
} else {
throw err;
}
});
Fix 5: Graceful Shutdown implementieren (verhindert das Problem)
Die Hauptursache ist häufig ein Server, der den Port beim Beenden nicht freigibt. Fügen Sie ordnungsgemäße Shutdown-Handler hinzu:
const server = app.listen(PORT, () => {
console.log("Server running on port " + PORT);
});
function shutdown(signal) {
console.log(signal + " received. Closing server...");
server.close(() => {
console.log("Server closed. Port released.");
process.exit(0);
});
setTimeout(() => {
console.error("Forced shutdown");
process.exit(1);
}, 10000);
}
process.on('SIGTERM', () => shutdown('SIGTERM'));
process.on('SIGINT', () => shutdown('SIGINT')); // Ctrl+C
Fix 6: Verwenden Sie nodemon für saubere Neustarts
npm install --save-dev nodemon
# package.json
{
"scripts": {
"dev": "nodemon server.js"
}
}
# nodemon cleanly restarts and releases ports between reloads
npm run dev
Wiederverwendbares Kill-Port-Skript
# kill-port.sh
#!/bin/bash
PORT=${1:-3000}
PID=$(lsof -ti :$PORT)
if [ -n "$PID" ]; then
echo "Killing process $PID on port $PORT"
kill -9 $PID
else
echo "No process on port $PORT"
fi
# Usage: ./kill-port.sh 3000
Häufig gestellte Fragen
F: Warum bleibt der Port verwendet, nachdem ich meine App beendet habe?
A: Normalerweise, weil der Prozess abrupt beendet wurde, ohne den Socket freizugeben, oder weil ein untergeordneter Prozess ihn immer noch hält. Graceful Shutdown-Handler verhindern dies.
F: Was bedeutet ::: in ‘:::3000’?
A: IPv6-Notation für „alle Schnittstellen“ (wie 0.0.0.0 in IPv4). Ihr Server bindet an alle Netzwerkschnittstellen an Port 3000.
F: Können zwei Apps denselben Port teilen?
A: Nein – es kann sich immer nur ein Prozess an einen Port einer Schnittstelle binden. Verwenden Sie verschiedene Ports oder einen Reverse-Proxy (Nginx), um nach Pfad/Domäne weiterzuleiten.
F: Wie vermeide ich das in Docker?
A: Jeder Container verfügt über einen eigenen Netzwerk-Namespace, sodass Konflikte nur bei der Hostzuordnung auftreten. Ordnen Sie verschiedene Host-Ports zu:-p 3001:3000.
F: Ist der Killall-Knoten sicher?
A: Es beendet ALLE Node.js-Prozesse – in der Entwicklung in Ordnung, aber seien Sie vorsichtig, wenn Sie andere Node-Apps haben, die Sie nicht stoppen möchten.
Fazit
EADDRINUSE bedeutet, dass der Port bereits belegt ist. Schnelle Lösung:Finden Sie den Prozess mitlsof -ti :PORT und töte es. Dauerhafter Fix:Fügen Sie ordnungsgemäße Shutdown-Handler hinzu Daher gibt Ihr Server den Port beim Beenden immer frei und verwenden Sienodemon in der Entwicklung für saubere Neustarts. Den Port überprocess.env.PORTkonfigurierbar machen geht Konflikten auch sofort aus dem Weg.
🔗 Share this article
✍️ Leave a Comment