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();
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);
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é.
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.
** 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).
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
pkill node
avant d'exécuter votre script devrait faire l'affaire.
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
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.
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]
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
Les fenêtres
1. netstat -ano | findstr :4200
2. taskkill /PID 5824 /F
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
Les fenêtres
set PORT=5000
Mac
export PORT=5000
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.
$Sudo netstat -plunt |grep :3000
Que la commande ci-dessus donne le résultat ci-dessous.
tcp6 0 0 :::3000 :::* LISTEN 25315/node
Maintenant, vous avez l'ID de processus (25315), Tuez ce processus.
kill -9 25315
npm run start
Remarque: cette solution pour les utilisateurs de Linux.
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
Essayez les deux commandes et cela arrêtera tous les processus de nœuds.
killall 9 node
pkill node
npm start
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
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
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.
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.
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
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;
Sudo lsof -i tcp:8080
Sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
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.
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
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.
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.
EADDRINUSE signifie que le port de votre application nodejs est déjà utilisé.
lsof-i tcp: 3000
kill -9 processId
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.
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.
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
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
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}"...`))
Il existe un moyen de terminer le processus à l'aide du gestionnaire de tâches:
Notez que cette solution est uniquement pour Windows
Allez dans le gestionnaire de tâches (ou en utilisant le raccourci Ctrl + Shift + Esc)
Sur "Processus en arrière-plan", recherchez les processus "Node.js" et mettez-les fin (Clic-droit dessus et choisissez "Fin de tâche")
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
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
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
Windows est toujours délicat avec l'open source.
change le port tout simplement ça marche
node-inspector --web-port=8099
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.
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.
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.