web-dev-qa-db-fra.com

Comment corriger l'erreur: écoutez EADDRINUSE tout en utilisant nodejs?

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

Pourquoi est-ce un problème pour nodejs, si je veux faire une demande, alors que je fais tourner un serveur sur le port 80? Pour les navigateurs Web, ce n’est pas un problème: je peux surfer sur Internet pendant que le serveur est en marche.

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();
377
Danny Fox

EADDRINUSE signifie que le numéro de port auquel 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 un autre serveur Web est exécuté sur ce port, vous devez placer node.js derrière ce serveur et le transférer par proxy.

Vous devriez vérifier l’événement listening comme ceci, pour voir si le serveur est vraiment à l’écoute:

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);
367
stewe

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

killall -9 node

Mais cela va tuer un processus système.

Avec 

ps ax

vous pouvez vérifier si cela a fonctionné.

472
Patrick

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

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

Dans ce cas, obtenez d'abord l'ID de processus (PID) du processus en cours d'exécution sur ce port (par exemple 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 juste (ps - en fait ne pas. Veuillez continuer à lire ci-dessous):

kill -9 57385

Vous pouvez en lire un peu plus à ce sujet ici .

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

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

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

kill -15 57385

EDIT 2: Comme a noté dans un commentaire ici plusieurs fois, cette erreur est la conséquence du fait de ne pas quitter un processus normalement. Cela signifie que beaucoup de personnes quittent une commande de noeud (ou une autre) en utilisant CTRL + Z. La manière correcte d’arrêter un processus en cours d’exécution consiste à exécuter la commande CTRL + C qui effectue une sortie en mode minimal.

Quitter un processus de la bonne façon libérera ce port lors de la fermeture. Cela vous permettra de relancer le processus sans avoir à vous soucier de le tuer avant de pouvoir le réexécuter à nouveau. 

235
Nobita

** AVANT DE RÉDUIRE - LISEZ s'il vous plaît la réponse. CELA IS PERTINENT! Si vous envisagez de changer de sujet, laissez un commentaire expliquant pourquoi vous pensez que cela n’est pas pertinent.


Skype écoute parfois sur le port 80 et provoque 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écocher cette case).

Turn off Skype port 80 usage

57
Rob Evans

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 l'application qui écoute sur un port connu.

Si vous utilisez unix, essayez cette commande: 

Sudo fuser -k 80/tcp    
33
Yaki Klein

pkill node avant d'exécuter votre script devrait faire l'affaire.

15
Javier Cobos

Votre application est déjà en cours d'exécution sur ce port 8080 . Utilisez ce code pour supprimer le port et réexécutez votre code

Sudo lsof -t -i tcp:8080 | xargs kill -9
15
ranjith

Une autre chose qui peut donner cette erreur est deux serveurs HTTP dans le même code de noeud. J'étais en train de mettre à jour un 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, cela a déclenché cette erreur.

14
Evan Carroll

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

lsof -PiTCP -sTCP:LISTEN

Cela va afficher une liste des ports que votre système utilise. Trouvez la PID que votre noeud exécute

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 lancez kill -9 [YOUR_PID]

13
hientrq

Raison de l'erreur: Vous essayez d'utiliser le port number occupé

Il existe deux solutions possibles pour résoudre ce problème sous 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 libre

Les fenêtres

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

 enter image description here

Mac

Vous pouvez essayer netstat

netstat -vanp tcp | grep 3000

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

Sudo lsof -i tcp:3000

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


2. Changer le numéro de port?

Les fenêtres

set PORT=5000

Mac

export PORT=5000
11
WasiF

EADDRINUSE signifie que le port (que nous essayons d'écouter dans l'application nœud) est déjà utilisé. Pour surmonter ce problème, 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:

Maintenant, vous avez l'ID de processus (25315), Tuez ce processus. 

kill -9 25315

étape 3:

npm run start

Remarque: cette solution pour les utilisateurs de Linux.

8
thavaamm

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 lancez votre serveur

5

Essayez les deux commandes et cela arrêtera tous les processus de nœuds.

killall 9 node
pkill node
npm start 
4
Anupam Maurya

Cette erreur survient lorsque vous exécutez un processus sur un port sur lequel vous souhaitez exécuter votre application.

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

sortie: vous obtiendrez les informations de processus utilisant ce port

tcp 0 0 adresse IP: 3000: LISTEN 26869/noeud 

Vous pouvez maintenant arrêter ce processus Sudo kill -9 26869

4
WAQAR SHAIKH

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

Ou si vous souhaitez attribuer le même port à l'application. Ensuite, supprimez l'application en cours d'exécution sur le port de votre choix.

Pour une application de noeud, recherchez ce que vous pouvez essayer, trouver l'ID de processus pour l'application de noeud en:

ps -aux | grep node

Après avoir obtenu l'identifiant du processus, faites

kill process_id
3
Parth Vyas

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

node server.js

encore. cela fonctionne pour moi, un temps suffit d'attendre quelques secondes jusqu'à ce que cela fonctionne à nouveau.

Mais cela ne fonctionne que sur une machine de développement et non sur une console de serveur.

3
robinclark007

Dans la commande ci-dessous, remplacez votre numéro de port

Sudo lsof -t -i tcp:portNumber | xargs kill -9

J'ai déjà vu cette erreur (dans le noeud) avec http.client et, si je me souviens bien, le problème tenait à ne pas initialiser le httpClient ni à définir de mauvaises options dans la création de httpClient et/ou dans la demande d'URL.

2
ControlAltDel

Sur Debian, j’ai découvert que le port 80 fonctionnait, vous devez exécuter la commande en tant qu’utilisateur root 

Sudo node app.js

J'espère que ça aide 

2
Khurram Ijaz

Dans mon cas, Apache HTTP Server était exécuté sur le port 80, je l'ai résolu en lançant la commande en tant que root.

Sudo killall httpd

Mettre à 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 voulez arrêter Jenkins une seule fois, exécutez: Sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
2
Chotala Paresh

On dirait qu’un autre processus de service de nœuds est en cours d’exécution. Vérifiez-le en tapant ceci dans votre console (Linux/Mac):

ps aux|grep node

et le quitter avec:

kill -9 <NodeProcessId>

OU alternativley utiliser 

ng serve --port <AnotherFreePortNumber>

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

2
Birol Efe

Pour les autres utilisateurs de Windows 10 dont le nœud est localhost et qui s'exécute sur un port tel que 3500, et non 80 ...

Qu'est-ce qui ne fonctionne pas:

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

Ce qui montre 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 sous Windows 

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

Remarquez le PID (extrême droite)
Je ne pouvais pas obtenir killall au travail ... alors 

  1. Ouvrez votre gestionnaire de tâches
  2. Dans l'onglet Processus, cliquez avec le bouton droit sur Nom ou sur une colonne, puis sélectionnez pour inclure le PID.
  3. Triez par PID, puis cliquez avec le bouton droit sur le PID droit, puis cliquez sur terminer la tâche.

Maintenant, après cet exercice peu amusant sur Windows, je me suis rendu compte que je pouvais utiliser le gestionnaire de tâches, trouver le moteur de nœud et le terminer.

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

1
Tom Stickel

J'ai eu le même problème récemment.

Cela signifie que le port est déjà utilisé par une autre application (logiciel express ou autre)

Dans mon cas, j'avais accidentellement exécuté Express sur 2 terminaux. Sortir du terminal en utilisant «Ctrl + C» corrige les choses pour moi. (Exécuter le serveur à partir d'un seul terminal)

J'espère que ça aide les autres.

1
Rahul Makhija

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

  • Maintenant, vous devez tuer 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 un identifiant de processus à partir de ceci.
  • Lance ça:

kill -9 processId

1
Sidharth Srivastava

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

ps -aef | grep 'node' 

pour regarder le processus de noeud alors, la console affiche le processus avec PID .

kill -9 PID

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

1
Jorge Mejia

Je préférerais faire 

killall -15 node 

parce que, kill -15 donne au processus une chance de se nettoyer lui-même . Maintenant, vous pouvez vérifier en

ps aux | grep node

Remarque: Si vous ne donnez pas au processus la possibilité de terminer ce qu'il est en train de faire et de le nettoyer, cela peut conduire à des fichiers corrompus. 

1
Smshrimant
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
1
Pramod Jain

Deux serveurs ne pouvant pas écouter sur le même port, vérifiez si un autre serveur écoute sur le même port, et vérifiez également si le navigateur est synchronisé s'il fonctionne sur le même port

1
blackHawk

L'erreur EADDRINUSE (adresse déjà utilisée) indique qu'il existe déjà un autre processus sur le système local occupant cette adresse/ce port.

Il existe un paquet npm appelé find-process qui aide à trouver (et à fermer) le processus d'occupation.

Voici un petit code de démonstration:

const find = require('find-process')

const PORT = 80

find('port', PORT)
.then((list) => {
  console.log(`Port "${PORT}" is blocked. Killing blocking applications...`)
  const processIds = list.map((item) => item.pid)
  processIds.forEach((pid) => process.kill(pid, 10))
})

J'ai préparé un petit échantillon qui peut reproduire l'erreur EADDRINUSE. Si vous lancez le programme suivant dans deux terminaux distincts, vous verrez que le premier terminal démarrera un serveur (sur le port "3000") et le deuxième terminal fermera le serveur en cours d'exécution EADDRINUSE):

Exemple de travail minimal:

const find = require('find-process')
const http = require('http')

const PORT = 3000

// Handling exceptions
process.on('uncaughtException', (error) => {
  if (error.code === 'EADDRINUSE') {
    find('port', PORT)
      .then((list) => {
        const blockingApplication = list[0]
        if (blockingApplication) {
          console.log(`Port "${PORT}" is blocked by "${blockingApplication.name}".`)
          console.log('Shutting down blocking application...')
          process.kill(blockingApplication.pid)
          // TODO: Restart server
        }
      })
  }
})

// Starting server
const server = http.createServer((request, response) => {
  response.writeHead(200, {'Content-Type': 'text/plain'})
  response.write('Hello World!')
  response.end()
})

server.listen(PORT, () => console.log(`Server running on port "${PORT}"...`))
1
Benny Neugebauer

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

Notez que cette solution est uniquement pour Windows

  1. Allez dans le gestionnaire de tâches (ou en utilisant le raccourci Ctrl + Shift + Esc)

  2. Sur "Processus en arrière-plan", recherchez les processus "Node.js" et mettez-les fin (Clic-droit dessus et choisissez "Fin de tâche")

enter image description here

  1. Maintenant, vous devriez pouvoir recommencer
1
Jee Mok

Tuer NODE_PORT peut tuer votre processus Chrome ou tout ce qui écoute le même port, ce qui est agaçant. 

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
1
Nizar Blond

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
1
prakash tank

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

Stop-Process -processname node
0
rawel

Windows est toujours délicat avec l'open source.

change le port tout simplement ça marche

node-inspector --web-port=8099
0
Ignatius Andrew

Vous avez cette erreur lorsque nous avions accidentellement deux environnements Express locaux dans la même instance pointant vers le même port.

Si vous en êtes aussi loin dans la liste des réponses, j’espère que cela vous aidera et résoudra votre problème. 

0
Michael Davidson

Cela m'est arrivé parce que mon serveur s'exécutait dans une autre fenêtre de terminal. Fermer la connexion a résolu le problème.

0
cocomatt

EADDRINUSE se traduit par "Le port sur lequel vous essayez d'émettre app.listen () est utilisé par d'autres programmes". Vous pouvez utiliser un script comme celui-ci pour vérifier si votre port est utilisé, puis modifiez-le dans votre app.listen ().

var net = require('net');
var errors = ['EADDRINUSE'];    
var isUsed = function(port) {
    var tester = net.createServer()
        .once('error', function (err) {
          if (!errors.includes(err.code)) {
           console.log("Port is in use, change the port.");
          }
        })
        .once('listening', function() {
            tester.once('close', function() { 
                console.log("You are good to go."); 
            })
            .close()
        })
        .listen(port);
}

Vous pouvez ajouter d'autres erreurs dans le tableau des erreurs pour vérifier toutes sortes de types d'erreur.

0