ExpressJS - throw er Evénement d'erreur non géré

181

J'ai créé l'application expressjs en utilisant les commandes suivantes:

express -e folderName
npm install ejs --save
npm install

Lorsque j'exécute l'application avec:, node app.jsj'ai les erreurs suivantes:

events.js:72
    throw er; // Unhandled 'error' event
          ^
Error: listen EADDRINUSE
    at errnoException (net.js:884:11)
    at Server._listen2 (net.js:1022:14)
    at listen (net.js:1044:10)
    at Server.listen (net.js:1110:5)
    at Object.<anonymous> (folderName/app.js:33:24)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)

Comment le réparer?

JR Galia
la source
30
EADDRINUSE signifie que le port est déjà utilisé. essayez de changer le port sur lequel le serveur Web dans app.js écoute ou supprimez tout ce qui utilise actuellement ce port si vous n'en avez pas besoin.
go-oleg
Si la fermeture du port ne résout pas le problème, essayez ceci> stackoverflow.com/a/52441297/6665568
Natesh bhat

Réponses:

402

Vous aviez exécuté un autre serveur utilisant le même port comme 8080.

Peut-être que vous avez exécuté node appdans un autre shell, fermez-le et relancez-le.

Vous pouvez vérifier le PORT no. est disponible ou n'utilise pas

netstat -tulnp | grep <port no>

Vous pouvez également utiliser lsof :

lsof -i :<port no>
Glowin
la source
5
Je suis tombé dessus en utilisant WebStorm. J'ai eu deux sessions de débogage ouvertes dans le même espace de travail. Doh!
Nick Curran
53
Une erreur aussi courante mérite vraiment un meilleur message d'erreur.
Tamlyn
Cela m'est arrivé lors de l'utilisation de node-activedirectory. Mon baseDN manquait le sous-domaine. baseDN: 'ldap: // dc = sous-domaine, dc = domaine, dc = com'
Marquez
Exécutait une instance de rails server...: |
Sheharyar
1
sur mac high sierra: lsof -nP -i4TCP: $ PORT | grep
LISTEN
61

Nous obtenons une erreur similaire lorsque nous exécutons parfois notre application express. Nous devons suivre la même chose dans ce cas. Nous devons vérifier s'il fonctionne dans n'importe quel terminal. Si vous souhaitez rechercher et tuer le processus, procédez comme suit:

  • ps aux | noeud grep
  • Trouvez l'ID de processus (deuxième à partir de la gauche):
  • kill -9 PRCOCESS_ID

OU

Utilisez une seule commande pour fermer tous les processus de noeud en cours d'exécution.

ps aux | awk '/node/{print $2}' | xargs kill -9
monique
la source
5
ps aux | grep node | awk '{print $2}' | xargs kill -9
Daniel
killall -r node(sous linux)
jt3k
26

Une instance est probablement toujours en cours d'exécution. Cela résoudra le problème.

killall node

Mise à jour: cette commande ne fonctionnera que sur Linux / Ubuntu et Mac.

TawabG
la source
1
killall -9 node
Pankaj Shinde
16

Si vous êtes sous Linux, ce problème peut également survenir si Nodejs ne s'exécute pas en tant que root.

Changez de ceci:

nodejs /path/to/script.js

Pour ça:

sudo nodejs /path/to/script.js

Cela m'est juste arrivé et aucune des autres suggestions ici n'a résolu le problème. Heureusement, je me suis souvenu que le script fonctionnait l'autre jour lors de l'exécution en tant que root. J'espère que cela aide quelqu'un!

Avertissement: ce n'est probablement pas la meilleure solution pour un environnement de production. Le démarrage de votre service en tant que root peut introduire des failles de sécurité sur votre serveur / application. Dans mon cas, c'était une solution pour un service local, mais j'encouragerais les autres à passer plus de temps à essayer d'isoler la cause.

Sans cause
la source
1
Cela semble vraiment dangereux de simplement exécuter le script en tant que root pour résoudre ce problème. À moins que vous n'essayiez de vous lier à un port inférieur à 1024, vous ne devriez jamais avoir besoin d'exécuter node en tant que root. Je soupçonne que dans votre cas, vous essayez de vous lier au port 80 ou 443. Je suggérerais d'utiliser Nginx pour diriger le trafic de ces ports vers nodejs sur un port plus élevé, comme 8000 ou quelque chose.
varikin
1
Merci d'avoir fait remarquer cela. Je ne pense pas que le script particulier que j'utilisais ait appelé l'un de ces ports, je n'utilise certainement pas Node comme serveur http. Peut-être était-ce l'un des modules que j'ai utilisés qui appelaient des autorisations supplémentaires? Je m'excuse que cela fait un moment, donc je ne sais même pas quel script a appelé cette solution. J'ajouterai une clause de non-responsabilité concernant cette tentative dans un environnement de production.
CauselessEffect
13

Cela est dû au fait que le port que vous utilisez pour exécuter le script est déjà utilisé. Vous devez arrêter tous les autres nœuds qui utilisent ce message. pour cela, vous pouvez vérifier tous les nœuds par

ps -e

OU pour le processus de nœud uniquement utiliser ps -ef | grep node Cela vous donnera la liste de tous les processus de nœud avec l'id

pour tuer tous les processus de nœud

sudo killall -9 node

Ou pour l'identifiant spécifique sudo kill -9 id

Abhinav Bhardwaj
la source
tu as sauvé ma NUIT!
Mujtaba Mahmood
8

J'ai corrigé le bogue en changeant le port qui était

app.set('port', process.env.PORT || 3000);<br>

et changé en:

app.set('port', process.env.PORT || 8080);<br>
Marcdahan
la source
1
En quoi cela diffère-t-il de l'application de ce que la réponse acceptée dit à la réponse donnée par Mark?
EWit le
3

Le port Node tente d'utiliser peut déjà être utilisé par un autre programme. Dans mon cas, c'était ntop , que j'avais récemment installé. J'ai dû ouvrir http: // localhost: 3000 / dans un navigateur pour le réaliser. Une autre façon de trouver le processus est donnée ici .

Fabien
la source
2

Si vous souhaitez utiliser le même numéro de port, saisissez kill %le terminal, ce qui tue le processus d'arrière-plan actuel et libère le port pour une utilisation ultérieure.

Suneha Javid
la source
2

cela signifie que votre fichier est en cours d'exécution maintenant. entrez simplement le code ci-dessous et réessayez:

sudo pkill node
Abolfazl Miadian
la source
2

En fait, les touches Ctrl + C ne libèrent pas le port utilisé par le processus de nœud. Il y a donc cette erreur. La résolution du problème utilisait l'extrait de code suivant dans server.js:

process.on('SIGINT', function() {
  console.log( "\nGracefully shutting down from SIGINT (Ctrl-C)" );
  // some other closing procedures go here
  process.exit(1);
});

Cela a fonctionné pour moi.

Vous pouvez également rechercher d'autres solutions mentionnées à l' arrêt progressif dans NodeJS

Pankaj Shinde
la source
Meilleure réponse Mérite beaucoup plus de votes.
skiabox
1

Fermez tous les autres serveurs de nœuds en cours d'exécution, même s'ils se trouvent dans d'autres fenêtres de terminal ou sur des ports différents. Cela devrait régler le problème.

Jake McGuire
la source
1

Si vous avez essayé de tuer toutes les instances de nœuds et autres services à l'écoute sur 3000 (la valeur par défaut utilisée par la configuration du squelette express) en vain, vous devez vous assurer que votre environnement ne définit pas «port» comme quelque chose d'inattendu. Sinon, vous obtiendrez probablement la même erreur. Dans le fichier app.js du squelette express, vous remarquerez la ligne 15:

app.set('port', process.env.PORT || 3000);
marque
la source
1

Pour résoudre ce problème, arrêtez ou fermez le serveur que vous exécutez. Si vous utilisez Eclipse IDE, suivez ceci,

Exécuter> Déboguer

entrez la description de l'image ici

Cliquez avec le bouton droit sur le processus en cours et cliquez sur Terminer .

Prashanth Sams
la source
1

events.js: 183 lanceur; // Evénement "erreur" non géré

J'ai aussi eu le même genre de problème et essayé de nombreuses façons, mais j'ai finalement obtenu ceci, cela fonctionne bien:

npm install ws@3.3.2 --save-dev --save-exact

Reportez-vous à ce lien pour plus de précisions https://github.com/ionic-team/ionic-cli/issues/2922

Janith Udara
la source
1

Raison de cette erreur

Un autre processus est déjà en cours d'exécution sur le port que vous avez spécifié

Solution simple et rapide

Sous Linux OS, par exemple, vous avez spécifié 3000 comme port

  • Ouvrez le terminal et exécutez lsof -i :3000. Si un processus est déjà en cours d'exécution sur le port 3000, vous verrez cette impression sur la console

COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
node    16615 aegon   13u  IPv6 183768      0t0  TCP *:3000 (LISTEN)

  • Copiez le PID (ID de processus) de la sortie

  • Exécuter sudo kill -9 16615(vous devez mettre PID après -9)

  • Redémarrez le serveur
Hadi Mir
la source
0

Dans mon cas, j'ai dû courir vagrant reloadaussi. Même sans processus de nœud exécutant mon application express dans ma machine virtuelle, j'obtenais toujours cette erreur jusqu'au rechargement de la boîte vagrant.

cbaigorri
la source
0

Arrêtez le service qui utilise ce port.

sudo service NAMEOFSERVICE stop
Meule
la source
0

Dans mon cas , la question a été causé par l' oubli d'appel next()dans un express.js appel de méthode `utilisation.

Si le middleware actuel ne termine pas le cycle requête-réponse, il doit appeler next () pour passer le contrôle au middleware suivant, sinon la requête sera laissée en suspens.

http://expressjs.com/guide/using-middleware.html

Andrew Dwyer
la source
0

Vous pouvez également changer le port de Gruntfile.js et exécuter à nouveau.

Narendra Solanki
la source
0

Après avoir tué le même processus plusieurs fois et ne pas être en mesure de localiser ce qui fonctionnait sur le port 8000, j'ai réalisé que j'essayais de courir sur le port 8000 deux fois:

Avant:

MongoClient.connect(db.url, (err, database) => {
  if (err) return console.log(err);
  require('./app/routes')(app, database);

  app.listen(port, () => {
    console.log('We are live on ' + port);
  });
});

require('./app/routes')(app, {});
app.listen(port, () => {
  console.log("We are live on " + port);
});

Après:

MongoClient.connect(db.url, (err, database) => {
  if (err) return console.log(err);
  require('./app/routes')(app, database);

  app.listen(port, () => {
    console.log('We are live on ' + port);
  });
});

require('./app/routes')(app, {});
Andrew Southard
la source
0

J'ai eu le même problème et j'ai découvert qu'un processus nodejs que j'avais précédemment annulé avec CTRL + C était toujours en cours d'exécution. Le problème dans Windows 10 est que Ctrl + C ne tue pas gracieusement nodejs. J'ai ouvert le gestionnaire de tâches et tué le processus manuellement. Les solutions fournies sur GitHub ne fonctionnaient pas pour moi.

Gregor Weichbrodt
la source
0

Si vous utilisez Windows, vous pouvez terminer le processus à partir du gestionnaire de tâches pour node.js

CodeRider
la source
0

Aucune des réponses n'a fonctionné pour moi.

Lorsque j'ai redémarré mon ordinateur, je pouvais mettre le serveur en marche.

Mac
shutdown now -r

Linux
sudo shutdown now -r

Tiagomenegaz
la source
0

-> vérifiez ce qui fonctionne sur le port 8080 ou ce que vous voulez vérifier

lsof -i @localhost:8080

si quelque chose est en cours d'exécution, vous pouvez le fermer ou utiliser une commande kill pour le fermer

rabiaasif
la source
0

Il suffit de vérifier votre teminal dans Visual Studio Code Parce que j'exécutais mon application de nœud et que j'hiberne mon ordinateur portable, puis le lendemain matin, je rallume mon ordinateur portable pour le développement de logiciels. Ensuite, j'exécute la nouvelle commande nodemon app.js. Le premier waas fonctionnant de nuit et le second exécutait ma dernière commande, donc deux invites de commande écoutent les mêmes ports, c'est pourquoi vous rencontrez ce problème. Fermez simplement un termianl ou tous les terminaux, puis exécutez votre nœud app.js ou nodemon app.js

zaib
la source
0

Le port que vous écoutez est déjà écouté par un autre processus.

Quand j'ai fait face à cette erreur, j'ai tué le processus en utilisant Windows PowerShell (car j'ai utilisé Windows)

  1. Élément de listeOuvrir le PowerShell Windows
  2. tapez pspuis vous pouvez obtenir la liste des processus
  3. recherchez le processus nommé node et notez l' identifiant
  4. tapez Stop-process <Id> je pense que c'est une aide pour les utilisateurs de Windows
Anush
la source
0

J'ai rencontré le même problème aujourd'hui et le port n'a pas été utilisé. L'approche suivante a aidé:

rm -rf node_modules && npm cache clean && npm install
npm start
seb_dom
la source
0

SI c'est sous mac, il s'agit de l'adresse IP de x86_64-apple-darwin13.4.0. Si vous suivez des erreurs, ce serait quelque chose lié à x86_64-apple-darwin13.4.0. Ajouter

127.0.0.1 x86_64-pomme-darwin13.4.0

dans le fichier / etc / hosts . Alors le problème est parti

Shravan
la source
-1

Changez simplement votre port, peut-être que votre port actuel est utilisé par iis ou un autre serveur.

Akash
la source
Cela a été demandé et répondu il y a 4 ans avec la même mais meilleure réponse.
George