Back

Corriger l'erreur : 'listen EADDRINUSE: address already in use' dans Node.js

Corriger l'erreur : 'listen EADDRINUSE: address already in use' dans Node.js

La redoutable erreur EADDRINUSE survient quand vous vous y attendez le moins. Vous êtes prêt à démarrer votre serveur Node.js, mais au lieu d’une application en cours d’exécution, vous obtenez : Error: listen EADDRINUSE: address already in use :::3000. Cette erreur Node.js EADDRINUSE signifie qu’un autre processus utilise déjà le port auquel vous tentez de vous lier. Voici comment identifier et corriger rapidement ce conflit de port dans Node.js.

Points clés à retenir

  • L’erreur EADDRINUSE se produit lorsqu’un port est déjà occupé par un autre processus
  • Utilisez lsof sur macOS/Linux ou netstat sur Windows pour identifier le processus bloquant
  • Terminez le processus en utilisant son PID ou implémentez des gestionnaires d’arrêt gracieux
  • Prévenez les conflits futurs avec une sélection dynamique de port et une gestion appropriée des signaux

Qu’est-ce qui cause l’erreur EADDRINUSE ?

L’erreur listen EADDRINUSE se produit lorsque votre application Node.js tente de se lier à un port déjà occupé. Les coupables habituels incluent :

  • Une instance précédente de votre serveur encore en cours d’exécution
  • Une autre application utilisant le même port
  • Des processus zombies issus d’applications Node.js plantées
  • Des outils de rechargement à chaud comme nodemon qui ne nettoient pas correctement
  • Des terminaux intégrés d’IDE qui maintiennent les processus actifs

Comment trouver quel processus utilise le port

Avant de pouvoir libérer le port occupé, vous devez identifier ce qui l’utilise. Les commandes diffèrent selon le système d’exploitation.

macOS et Linux

Utilisez lsof pour trouver le processus :

lsof -i :3000

Cela retourne les détails du processus incluant le PID (identifiant de processus) :

COMMAND   PID    USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node     12345   you   11u  IPv6 0xac745b2749fd2be3      0t0  TCP *:3000 (LISTEN)

Windows

Utilisez netstat pour identifier le processus :

netstat -ano | findstr :3000

La sortie affiche le PID dans la dernière colonne :

TCP    0.0.0.0:3000    0.0.0.0:0    LISTENING    12345

Comment terminer le processus et libérer le port

Une fois que vous avez le PID, vous pouvez terminer le processus pour libérer le port.

Solutions pour macOS et Linux

Commande rapide en une ligne :

lsof -ti:3000 | xargs kill -9

Approche manuelle :

kill -15 12345  # Arrêt gracieux (préféré)
kill -9 12345   # Forcer l'arrêt si -15 ne fonctionne pas

Alternative utilisant fuser :

sudo fuser -k 3000/tcp

Solutions pour Windows

Invite de commandes :

taskkill /PID 12345 /F

PowerShell :

Stop-Process -Id 12345 -Force

Méthode GUI : Ouvrez le Gestionnaire des tâches (Ctrl+Shift+Esc), trouvez le processus Node.js et terminez-le.

Prévenir les futurs conflits de port

Implémenter un arrêt gracieux

Ajoutez des gestionnaires de nettoyage appropriés à votre serveur Node.js pour prévenir les erreurs de port :

const server = app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});

// Handle termination signals
process.on('SIGTERM', () => {
  server.close(() => {
    console.log('Server closed gracefully');
    process.exit(0);
  });
});

process.on('SIGINT', () => {
  server.close(() => {
    console.log('Server closed gracefully');
    process.exit(0);
  });
});

Utiliser une sélection dynamique de port

Évitez de coder en dur les ports. Utilisez des variables d’environnement ou trouvez automatiquement un port disponible :

const PORT = process.env.PORT || 3000;

// Or check port availability before binding
const net = require('net');

function getAvailablePort(startPort) {
  return new Promise((resolve) => {
    const server = net.createServer();
    server.listen(startPort, () => {
      const port = server.address().port;
      server.close(() => resolve(port));
    });
    server.on('error', () => {
      getAvailablePort(startPort + 1).then(resolve);
    });
  });
}

Gérer l’erreur par programmation

Interceptez l’erreur et répondez de manière appropriée :

server.on('error', (err) => {
  if (err.code === 'EADDRINUSE') {
    console.error(`Port ${PORT} is already in use`);
    // Try another port or exit gracefully
    process.exit(1);
  }
});

Scénarios courants et correctifs rapides

Nodemon ne libère pas les ports

Si vous utilisez nodemon, assurez-vous de l’arrêter avec Ctrl+C, et non Ctrl+Z. Ce dernier suspend le processus sans libérer le port.

Conflits de conteneurs Docker

Vérifiez les conteneurs en cours d’exécution :

docker ps
docker stop <container_id>

Problèmes de terminal VS Code

Fermez tous les terminaux intégrés avant de redémarrer votre serveur. Parfois, VS Code maintient les processus actifs en arrière-plan.

Multiples instances de serveur dans le code

Assurez-vous de ne pas appeler app.listen() plusieurs fois dans votre code. Cette erreur courante déclenche immédiatement l’erreur address already in use.

Conclusion

L’erreur Node.js EADDRINUSE est frustrante mais facilement corrigible. Trouvez le processus utilisant votre port avec lsof ou netstat, terminez-le, et implémentez des gestionnaires d’arrêt appropriés pour prévenir les occurrences futures. Rappelez-vous : des arrêts gracieux avec des gestionnaires de signaux et une sélection dynamique de port vous éviteront de devoir gérer à répétition cette erreur de port du serveur Node.js.

FAQ

Oui, vous pouvez implémenter un changement automatique de port en interceptant l'erreur EADDRINUSE et en essayant le prochain port disponible. Utilisez une fonction récursive ou une boucle pour tester les ports séquentiellement jusqu'à en trouver un ouvert, ou utilisez des bibliothèques comme portfinder qui gèrent cela automatiquement.

Fermer une fenêtre de terminal ne termine pas toujours les processus en cours d'exécution. Les processus en arrière-plan, en particulier ceux démarrés avec nohup ou en tant que services, continuent de fonctionner. Utilisez toujours des commandes de terminaison appropriées comme Ctrl+C ou terminez explicitement le processus en utilisant son PID pour vous assurer que le port est libéré.

Utiliser kill -9 force une terminaison immédiate sans permettre le nettoyage, ce qui peut causer une perte ou une corruption de données. Essayez toujours kill -15 d'abord pour un arrêt gracieux. Réservez kill -9 aux processus qui ne répondent pas. Implémentez des gestionnaires de signaux appropriés dans votre code pour garantir des arrêts propres.

Gain Debugging Superpowers

Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay