Comment réparer l'erreur: écouter EADDRINUSE lors de l'utilisation de nodejs?

466

Si j'exécute un serveur avec le port 80 et j'essaie d'utiliser xmlHTTPrequest, j'obtiens cette erreur:Error: listen EADDRINUSE

Pourquoi est-ce un problème pour nodejs, si je veux faire une demande, alors que j'exécute un serveur sur le port 80? Pour les navigateurs, ce n'est pas un problème: je peux surfer sur Internet pendant que le serveur tourne.

Le serveur est:

  net.createServer(function (socket) {
    socket.name = socket.remoteAddress + ":" + socket.remotePort;
    console.log('connection request from: ' + socket.remoteAddress);
    socket.destroy();
  }).listen(options.port);

Et la demande:

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();
Danny Fox
la source
Êtes-vous sûr que options.port est défini sur 80? Le code XHR fonctionne-t-il dans un navigateur? Pouvez-vous exécuter "nc -l 0.0.0.0 80" lorsque ce serveur ne fonctionne pas?
Timothy Meade
Voir un problème similaire sur stackoverflow.com/questions/8553957/…
Manohar Reddy Poreddy
Sur quel système êtes-vous? Certains systèmes nécessitent sudo si vous souhaitez écouter les ports en dessous d'un certain seuil.
Kebman
ce problème se produit parce que vous avez soit exécuté votre serveur sur ce port et que vous n'avez pas fermé ce port, l'erreur indique clairement que le port est déjà utilisé, cela se produit pour moi lorsque j'ouvre un nouveau projet en code vs sans fermer d'autres projets (ouverture par glisser-déposer)
Ashad Nasim

Réponses:

412

EADDRINUSEsignifie que le numéro de port qui listen()tente de lier le serveur à est déjà utilisé.

Donc, dans votre cas, il doit déjà y avoir un serveur sur le port 80.

Si vous avez un autre serveur Web en cours d'exécution sur ce port, vous devez mettre node.js derrière ce serveur et le proxy via lui.

Vous devriez vérifier l' listeningévénement comme celui-ci, pour voir si le serveur écoute vraiment:

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);
stewe
la source
1
Je lance uniquement ce serveur. Avant de démarrer le serveur, la fonction xmlhttprequest fonctionne. Après avoir démarré le serveur sur le port 80, le serveur fonctionne également parfaitement. Mais si je fais une xmlhttprequest après avoir démarré le serveur, j'obtiens cette erreur.
Danny Fox
6
Cela ne générera-t-il pas toujours une erreur si le serveur écoute déjà?
trysis
1
Pour moi, cela a été causé par Skype
Beep
559

Ce qui m'a vraiment aidé, c'est:

killall -9 node

Mais cela tuera un processus système.

Avec

ps ax

vous pouvez vérifier si cela a fonctionné.

Patrick
la source
1
De même pour moi. Dans mon cas, je viens d'exécuter la fonction d'écoute deux fois et j'ai obtenu l'erreur dans le second
vabada
2
Sur une note connexe, vous pouvez également lire quand dois-je pas kil -9 un processus .
Nobita
12
Le problème ici est que vous ne quittez pas le processus de nœud avec élégance après la première exécution. Par conséquent, le nœud est toujours lié à ce port. ps aux | grep nodemontrerait cela. Au lieu de tuer l'application avec CTRL + Z , quittez l'application avec CTRL + C . Cela quitte l'application correctement et la liaison de port est supprimée.
riser101
22
Plus de 150 votes positifs pour une solution qui équivaut à frapper votre logiciel avec un maillet.
LeeGee
1
Cette solution est assez problématique car l'indicateur -9 tuera le processus sans libérer la mémoire. Vous ne devriez vraiment l'utiliser que comme dernière solution.
Yaki Klein
279

Ce qui précède killall -9 node, suggéré par Patrick fonctionne comme prévu et résout le problème, mais vous voudrez peut-être lire la partie d'édition de cette réponse pour savoir pourquoi ce kill -9n'est peut-être pas la meilleure façon de le faire.

En plus de cela, vous voudrez peut-être cibler un seul processus plutôt que de tuer aveuglément tous les processus actifs.

Dans ce cas, obtenez d'abord l'ID de processus (PID) du processus en cours d'exécution sur ce port (disons 8888):

lsof -i tcp:8888

Cela retournera quelque chose comme:

COMMAND   PID    USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node     57385   You   11u  IPv6 0xac745b2749fd2be3      0t0  TCP *:ddi-tcp-1 (LISTEN)

Ensuite, faites (ps - en fait pas . Continuez à lire ci-dessous):

kill -9 57385

Vous pouvez en lire un peu plus ici .

EDIT: Je lisais sur un sujet assez connexe aujourd'hui et suis tombé sur ce fil intéressant sur pourquoi devrais-je pas kill -9un processus .

En règle générale, vous devez utiliser kill -15 avant kill -9 pour donner au processus cible une chance de se nettoyer après lui-même. (Les processus ne peuvent pas attraper ou ignorer SIGKILL, mais ils peuvent et attrapent souvent SIGTERM.) Si vous ne donnez pas au processus une chance de terminer ce qu'il fait et de nettoyer, il peut laisser des fichiers corrompus (ou un autre état) autour qu'il ne pourra pas comprendre une fois redémarré.

Donc, comme indiqué, vous devriez mieux tuer le processus ci-dessus avec:

kill -15 57385

EDIT 2 : Comme indiqué dans un commentaire ici à plusieurs reprises, cette erreur est la conséquence de ne pas quitter un processus avec élégance. Cela signifie, beaucoup de gens quitter une commande de noeud (ou tout autre) en utilisant CTRL + Z . La façon correcte d'arrêter un processus en cours d'exécution est d'émettre la commande CTRL + C qui effectue une sortie propre.

Quitter un processus de la bonne façon libérera ce port pendant la fermeture. Cela vous permettra de redémarrer le processus sans passer par le problème de le tuer vous-même avant de pouvoir le relancer.

Nobita
la source
Où dois-je exécuter cette commande? À l'invite de commande? Sur la console NPM?
Ulysses Alves
@UlyssesAlves vient d'ouvrir une fenêtre de terminal et de tuer le processus à partir de là.
Nobita
@Nobita Est-ce que cela fonctionne sous Windows? Maintenant, je me rends compte que ce pourrait être une commande MAC OS. Quoi qu'il en soit, j'ai redémarré mon PC et je n'ai plus eu cette erreur. Je pense qu'une autre application utilisait le même nœud de port essayait d'utiliser.
Ulysses Alves
2
pgrep nodeindique si un processus de nœud s'est enfui sur vous. pkill nodeva les tuer.
Josh.F
3
pas pour windows, les gens - vous devez essayer un autre port ou redémarrer l'ordinateur: P
Tom Stickel
62

Juste une remarque, Skype écoutera parfois sur le port 80 et provoquera donc cette erreur si vous essayez d'écouter sur le port 80 à partir de Node.js ou de toute autre application.

Vous pouvez désactiver ce comportement dans Skype en accédant aux options et en cliquant sur Avancé -> Connexion -> Utiliser le port 80 (décochez-le)

Désactiver l'utilisation du port Skype 80

PS Après avoir fait ce changement, n'oubliez pas de redémarrer Skype!

Rob Evans
la source
14
PS Après avoir fait ce changement, n'oubliez pas de redémarrer Skype!
Rob Evans
16
C'est l'un des défauts de conception les plus stupéfiants que j'ai jamais vus. Comment fous sont les Skype devs qu'ils jamais envisager de prendre plus de 80 ou 443?
AJB
5
Big +1 pour vos compétences de débogage, Rob.
AJB
@AJB Ils l'ont fait pour essayer de percer les pare-feu qui limitent le trafic sortant aux requêtes http, mais lorsque les pare-feu n'utilisent pas DPI, il suffit de bloquer le port de base. Pourtant ... c'est un peu idiot d'activer cela par défaut!
Rob Evans
Oui, cela m'est venu à l'esprit après avoir réfléchi un peu à la raison pour laquelle ils feraient cela. Pourtant, un coup de coude vraiment laid. Et l'idée qu'il est activé par défaut est tout simplement arrogante.
AJB
39

Vous devriez essayer de tuer le processus qui écoute sur le port 80.

Killall va tuer toutes les applications de nœuds en cours d'exécution. Vous pourriez ne pas vouloir faire ça. Avec cette commande, vous ne pouvez tuer que la seule application qui écoute sur un port connu.

Si vous utilisez unix, essayez cette commande:

sudo fuser -k 80/tcp    
Yaki Klein
la source
1
Merci Yaki. le nœud killall a échoué pour moi mais cela a fonctionné.
Pat M
Merci! killall et lsof -i ne fonctionnaient pas pour moi, mais cela a fonctionné.
karfus
1
Vous ne voudrez peut-être pas tuer toutes les applications de nœud en cours d'exécution.
Yaki Klein
28

Raison de l'erreur: vous essayez d'utiliser l'occupationport number

Deux solutions possibles pour Windows / Mac

  1. Numéro de port actuellement utilisé gratuit
  2. Sélectionnez un autre numéro de port pour votre programme actuel


1. Numéro de port gratuit

les fenêtres

1. netstat -ano | findstr :4200
2. taskkill /PID 5824 /F

entrez la description de l'image ici

Mac

Vous pouvez essayer netstat

netstat -vanp tcp | grep 3000

Pour OSX El Capitan et plus récent (ou si votre netstat ne prend pas en charge -p), utilisez lsof

sudo lsof -i tcp:3000

si cela ne résout pas votre problème, les Macutilisateurs peuvent se référer à la discussion complète sur ce problème Trouver (et tuer) le port de verrouillage du processus 3000 sur Mac


2. Changer le numéro de port?

les fenêtres

set PORT=5000

Mac

export PORT=5000
WasiF
la source
vous pouvez aussi faire dans une seule commande dans Windows:netstat -ona | findstr ".0:PORT +0.0.0.0:0 +LISTENING" | for /f "tokens=5" %t in ('more') do taskkill /PID:%t /f
Z. Khullah
27

Sous un contrôleur env, vous pouvez utiliser:

pkill node avant d'exécuter votre script devrait faire le travail.

Gardez à l'esprit que cette commande tuera tous les node processus, ce qui pourrait être correct si vous avez par exemple un conteneur exécutant une seule instance, notre vous avez un tel environnement où vous pouvez le garantir.

Dans tout autre scénario, je recommande d'utiliser une commande pour tuer un certain identifiant ou nom de processus que vous avez trouvé en le recherchant par programme. comme si votre processus est appelé, node-server-1 vous pouvez le faire pkill node-server-1.

Cette ressource peut être utile à comprendre: https://www.thegeekstuff.com/2009/12/4-ways-to-kill-a-process-kill-killall-pkill-xkill/

Javier Cobos
la source
2
pgrep nodeavant si vous voulez être un peu prudent et voir quels nodeprocessus sont en cours d'exécution
Josh.F
1
Totalement !, je parlais au cas où ce serait un conteneur ou un endroit très contrôlé pour le processus.
Javier Cobos
C'est une réponse impressionnante que je dirai que les autres fournies ci-dessus. Tout le monde, s'il vous plaît, votez.
Jitendra Pawar
@JavierCobos: si vous parliez dans un conteneur ou un espace contrôlé similaire, veuillez ajouter ces informations à la réponse elle-même. De nombreuses personnes ne se trouvent pas dans de tels environnements, en particulier sur une machine de développement, ce qui pourrait avoir des conséquences inattendues telles quelles. Downvoting, mais heureux de changer le vote avec une clarification appropriée.
lindes
1
Beaucoup le feront ... mais en tant que personne qui passe beaucoup de temps à former des développeurs juniors, et même au-delà de ce contexte, je peux vous dire qu'un grand nombre de personnes utilisent les réponses sur Stack Overflow sans vraiment comprendre ce qu'elles font. .. ils sont juste confrontés à un problème et voient quelque chose représenté comme une solution à ce qui semble être leur problème, et ils courent avec. Alors ... Je souhaite personnellement que le site donne de bonnes explications et favorise de bonnes habitudes générales. C'est donc de là que je viens. Je sais que ce n'est pas la seule perspective, cependant. :)
lindes
16

Votre application s'exécute déjà sur ce port 8080. Utilisez ce code pour tuer le port et réexécutez votre code

sudo lsof -t -i tcp:8080 | xargs kill -9
ranjith
la source
La question fait référence au port 80, pas à 8080. De plus, bien que cela fonctionnerait probablement pour se débarrasser d'un processus offensant sur le port 8080, l'utilisation kill -9est presque certainement exagérée et, à mon avis, un conseil horrible à donner sans avertissements spécifiques sur il. Je killferais probablement l'affaire, et vraiment, le problème fondamental de cette question est, je pense, qu'ils essaient de relancer un serveur encore et encore, donc ce n'est qu'un hack, pas un correctif. Ils doivent avoir une meilleure compréhension de ce qui se passe, ce que cette réponse ne fournit pas vraiment.
lindes
15

Une autre chose qui peut donner cette erreur, c'est deux serveurs HTTP dans le même code de nœud. Je mettais à jour du code Express 2 vers Express 3, et j'avais ceci ...

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')); 
});                                                                   

Et, il a déclenché cette erreur.

Evan Carroll
la source
14

Cela fonctionne pour moi (j'utilise mac). Exécutez cette commande

lsof -PiTCP -sTCP:LISTEN

Cela va afficher une liste des ports que votre système utilise. Trouvez PIDque votre nœud est en cours d'exécution

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)

et courir kill -9 [YOUR_PID]

hientrq
la source
11

EADDRINUSEsignifie que le port (que nous essayons d'écouter dans l'application de noeud) est déjà utilisé. Pour surmonter, nous devons identifier le processus en cours d'exécution avec ce port.

Par exemple, si nous essayons d'écouter notre application de nœud dans le port 3000. Nous devons vérifier si ce port est déjà utilisé par un autre processus.

étape 1:

$sudo netstat -plunt |grep :3000

Que la commande ci-dessus donne le résultat ci-dessous.

tcp6       0      0 :::3000                 :::*                    LISTEN      25315/node

étape 2:

Vous avez maintenant l'ID de processus (25315), tuez ce processus.

kill -9 25315

étape 3:

npm run start

Remarque: Cette solution pour les utilisateurs de Linux.

Thavaprakash Swaminathan
la source
9
lsof -i:3000;
kill -9 $(lsof -t -i:3000);
// 3000 is a your port
// This "lsof -i:3000;" command will show PID 
kill PID 
ex: kill 129393
Pramod Jain
la source
3
Veuillez ajouter plus de contexte à vos réponses pour aider les futurs lecteurs à comprendre le code / la commande.
Milo
8

sudo kill $ (sudo lsof -t -i: 80)

pour tuer de force

sudo kill -9 $ (sudo lsof -t -i: 80)

utilisez ci-dessus cmd pour tuer un port particulier, puis exécutez votre serveur

Marla Tarakeswara Rao
la source
8

Essayez les deux commandes et cela arrêtera tout processus de nœud.

killall 9 node
pkill node
npm start 
Anupam Maurya
la source
1
ce hack m'a aidé, gagner beaucoup de temps grâce
Anoop PS
5

Cette erreur survient lorsque vous avez un processus en cours d'exécution sur un port sur lequel vous souhaitez exécuter votre application.

comment obtenir quel processus s'exécute sur ce port => commande: sudo netstat -ap | grep: 3000

sortie: vous obtiendrez les informations de processus qui utilisent ce port

tcp 0 0 IPaddress: 3000 : LISTEN 26869 / node

Vous pouvez maintenant tuer ce processus sudo kill -9 26869

WAQAR SHAIKH
la source
Vérifié toutes les réponses. Mais vous résolvez mon problème.
Rahul
5

Dans la commande ci-dessous, remplacez votre portNumber

sudo lsof -t -i tcp:portNumber | xargs kill -9
ramachandrareddy reddam
la source
5

EADDRINUSE signifie que le port de votre application nodejs est déjà utilisé.

  • Maintenant, vous avez tué le processus / l'application en cours d'exécution sur ce port.
  • Trouvez l'ID de processus de l'application en:

lsof -i tcp: 3000

  • Maintenant, vous obtiendrez l'ID de processus à partir de cela.
  • Lance ça:

kill -9 processId

Sidharth Srivastava
la source
4

Il existe un moyen de terminer le processus à l'aide du Gestionnaire des tâches:

Notez que cette solution est pour Windows uniquement

  1. Accédez au Gestionnaire des tâches (ou en utilisant le raccourci Ctrl+ Shift+ Esc)

  2. Sur "Processus d'arrière-plan", recherchez les processus "Node.js" et terminez-les (faites un clic droit dessus et choisissez "Fin de tâche")

entrez la description de l'image ici

  1. Vous devriez maintenant pouvoir recommencer
Jee Mok
la source
Pour les utilisateurs de Mac: 1. Lancez 'Activity Monitor' 2. Recherchez 'node' dans la barre de recherche en haut à droite. 3. Double-cliquez sur le processus du nœud et quittez. Vous êtes prêt!!!! Codage heureux.
Apogee
3

J'ai déjà vu cette erreur (dans le nœud) avec http.client, et si je me souviens bien, le problème était lié à l'initialisation de httpClient ou à la définition de mauvaises options dans la création httpClient et / ou dans la demande d'URL.

ControlAltDel
la source
3

J'ai aussi le même problème, et je ferme simplement le terminal et j'ouvre un nouveau terminal et je lance

node server.js

encore. cela fonctionne pour moi, un certain temps a juste besoin d'attendre quelques secondes jusqu'à ce qu'il fonctionne à nouveau.

Mais cela ne fonctionne que sur une machine développeur au lieu d'une console serveur.

robinclark007
la source
3

Erreur: écouter EADDRINUSE signifie que le port que vous souhaitez attribuer / lier à votre serveur d'applications est déjà utilisé. Vous pouvez soit attribuer un autre port à votre application.

Ou si vous souhaitez attribuer le même port à l'application. Ensuite, tuez l'application qui s'exécute sur le port souhaité.

Pour une application de nœud, vous pouvez essayer de trouver l'ID de processus pour l'application de nœud en:

ps -aux | grep node

Après avoir obtenu l'ID de processus, faites

kill process_id
Parth Vyas
la source
-aux sur windows 10?
Tom Stickel
Non -aux est pour les systèmes basés sur Linux. Pour les systèmes basés sur Windows, vous pouvez rechercher le système montior pour le processus de nœud souhaité et y mettre fin.
Parth Vyas
2

Sur Debian, j'ai découvert qu'il fonctionnait sur le port 80, vous devez émettre la commande en tant que root, c'est-à-dire

sudo node app.js

J'espère que ça aide

Khurram Ijaz
la source
2

Dans mon cas, Apache HTTP Server a été exécuté sur le port 80, je l'ai résolu en émettant la commande en tant que root

sudo killall httpd

Mise à jour

Si Jenkin est installé et fonctionne sur votre Mac;

  1. Vous pouvez le vérifier avec sudo lsof -i tcp:8080
  2. Si oui, et que vous ne voulez arrêter Jenkins qu'une seule fois, exécutez: sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
Chotala Paresh
la source
2

Il semble qu'un autre processus Node ng serve soit en cours d'exécution. Vérifiez-le en tapant ceci dans votre console (Linux / Mac):

ps aux|grep node

et quittez-le avec:

kill -9 <NodeProcessId>

OU utiliser alternativement

ng serve --port <AnotherFreePortNumber>

pour servir votre projet sur un port libre de votre choix.

Birol Efe
la source
1

Tout en tuant le NODE_PORT, cela pourrait tuer votre processus Chrome ou tout ce qui écoute le même port, et c'est ennuyeux.

Ce script shell peut être utile - dans mon cas, le port est 1337 mais vous pouvez le changer à tout moment

# 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
Nizar Blond
la source
1

Dans mon cas, j’utilise un hébergement web mais c’est la même chose chez l’hôte local, j’ai utilisé:

ps -aef | grep 'node' 

pour regarder le processus de nœud, la console affiche le processus avec PID. pour tuer le processus, vous devez utiliser cette commande:

kill -9 PID

où PID est l'ID de processus de la commande ci-dessus.

Jorge Mejia
la source
1

Deux serveurs ne peuvent pas écouter sur le même port, vérifiez donc si un autre serveur écoute sur le même port, vérifiez également la synchronisation du navigateur s'il fonctionne sur le même port

blackHawk
la source
1

Pour les autres sur Windows 10 avec noeud as localhostet fonctionnant sur un port comme 3500, pas 80 ...

Ce qui ne fonctionne pas:

killall    ?  command not found
ps -aux | grep 'node'     ?     ps:  user x unknown 

Ce qui affiche des informations mais ne fonctionne toujours pas:

 ps -aef | grep 'node'
 ps ax
 kill -9 61864

Qu'est-ce qui fonctionne:

Git Bash ou Powershell sur Windows

  net -a -o | grep 3500   (whatever port you are looking for) 

Remarquez le PID (à l'extrême droite),
je n'ai pas pu me rendre killallau travail ... alors

  1. Ouvrez votre gestionnaire de tâches
  2. Dans l'onglet des processus, cliquez avec le bouton droit sur le nom ou n'importe quelle colonne et sélectionnez pour inclure le PID
  3. Trier par PID, puis cliquer avec le bouton droit sur le PID droit et cliquer sur Fin de tâche.

Maintenant, après cet exercice pas si amusant sur Windows, j'ai réalisé que je pouvais utiliser le gestionnaire de tâches et trouver le moteur Node et le terminer.

Pour info, j'utilisais Visual Studio Code pour exécuter Node sur le port 3500, et j'utilise le shell Git Bash à l'intérieur du code VS. J'avais quitté gracieusement avec Ctrl + C, mais parfois cela ne le tue pas. Je ne veux pas changer mon port ou redémarrer donc cela a fonctionné. Espérons que cela aide les autres. Sinon, c'est de la documentation pour moi.

Tom Stickel
la source
1

Pour les utilisateurs de Windows, exécutez la commande suivante dans la fenêtre PowerShell pour tuer tous les processus de noeud.

Stop-Process -processname node
rawel
la source
1

L'option qui fonctionne pour moi:

Courir:

ps -ax | grep node

Vous obtiendrez quelque chose comme:

 8078 pts/7    Tl     0:01 node server.js
 8489 pts/10   S+     0:00 grep --color=auto node    
 kill -9 8078
réservoir de prakash
la source