How to fix Error: listen EADDRINUSE while using nodejs?


How to fix Error: listen EADDRINUSE while using nodejs?



If I run a server with the port 80, and I try to use xmlHTTPrequest i get this error: Error: listen EADDRINUSE


Error: listen EADDRINUSE



Why is it problem for nodejs, if I want to do a request, while I run a server on the port 80? For the webbrowsers it is not a problem: I can surf on the internet, while the server is running.



The server is:


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



And the request:


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();





@T.J. Crowder Thank you...
– Danny Fox
Mar 27 '12 at 22:22


@T.J. Crowder





Are you sure options.port is defined as 80? Is the XHR code running in a browser? Can you run "nc -l 0.0.0.0 80" when this server is not running?
– Timothy Meade
Mar 28 '12 at 0:34





See a similar issue at stackoverflow.com/questions/8553957/…
– Manohar Reddy Poreddy
Jun 26 '15 at 12:01





Which system are you on? Some systems require sudo if you want to listen to ports below a certain treshold.
– Kebman
Jul 30 '15 at 13:57




28 Answers
28



EADDRINUSE means that the port number which listen() tries to bind the server to is already in use.


EADDRINUSE


listen()



So, in your case, there must be running a server on port 80 already.



If you have another webserver running on this port you have to put node.js behind that server and proxy it through it.



You should check for the listening event like this, to see if the server is really listening:


listening


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





I run only this server. Befor I start the server, the xmlhttprequest works. After I start the server on the port 80, then the server also works perfectly. But if I do an xmlhttprequest after I started the server, then I get this error.
– Danny Fox
Mar 27 '12 at 22:54





Won't this still throw an error if the server is already listening?
– trysis
Jun 16 '15 at 16:27





For me this was caused by Skype
– Beep
Jun 21 '17 at 14:03



What really helped for me was:


killall -9 node



But this will kill a system process.



With


ps ax



you can check if it worked.





Also for me. In my case I just run the listen function twice and got the error in the second
– vabada
Apr 6 '15 at 7:16





On a related note you may also read when should i not kil -9 a process.
– Nobita
Aug 4 '15 at 10:00





worked for me too! short and effective answer.
– g07kore
Aug 22 '15 at 4:02





The Issue here is you guys are not exiting the node process gracefully after the first run. Therefore, node is still binded to that port. ps aux | grep node would show that. Instead of killing the application with CTRL+Z, exit the application with CTRL+C. This exits the application gracefully and the port binding is removed.
– riser101
Dec 7 '15 at 10:29



ps aux | grep node





Over 150 up-votes for a solution that equates to hitting your software with a mallet.
– LeeGee
Mar 23 '16 at 11:14



The aforementioned killall -9 node, suggested by Patrick works as expected and solves the problem but you may want to read the edit part of this very answer about why kill -9 may not be the best way to do it.


killall -9 node


kill -9



On top of that you might want to target a single process rather than blindly killing all active processes.



In that case, first get the process ID (PID) of the process running on that port (say 8888):



lsof -i tcp:8888


lsof -i tcp:8888



This will return something like:


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



Then just do (ps - actually do not. Please keep reading below):



kill -9 57385


kill -9 57385



You can read a bit more about this here.



EDIT: I was reading on a fairly related topic today and stumbled upon this interesting thread on why should i not kill -9 a process.


kill -9



Generally, you should use kill -15 before kill -9 to give the target process a chance to clean up after itself. (Processes can't catch or ignore SIGKILL, but they can and often do catch SIGTERM.) If you don't give the process a chance to finish what it's doing and clean up, it may leave corrupted files (or other state) around that it won't be able to understand once restarted.



So, as stated you should better kill the above process with:



kill -15 57385


kill -15 57385



EDIT 2: As noted in a comment around here many times this error is a consequence of not exiting a process gracefully. That means, a lot of people exit a node command (or any other) using CTRL+Z. The correct way of stopping a running process is issuing the CTRL+C command which performs a clean exit.



Exiting a process the right way will free up that port while shutting down. This will allow you to restart the process without going through the trouble of killing it yourself before being able to re-run it again.





It works for me in Mac Osx
– jruzafa
Jul 27 '15 at 16:03





pgrep node shows if any node process have run away on you. pkill node will kill em.
– Josh.F
Apr 27 '16 at 4:22


pgrep node


pkill node





works in Ubuntu 16.10, thanks man.
– kiwicomb123
Jul 3 '17 at 6:39





not for windows , folks - you have to try another port or reboot computer :P
– Tom Stickel
Jul 15 '17 at 7:56





Great explanation! Works on macOS Thank you!
– konekoya
Aug 30 '17 at 1:33



** BEFORE DOWNVOTING - Please READ the answer. IT IS RELEVANT! If you are going to downvote this, leave a comment why you think it isn't relevant.



Just a head's up, Skype will sometimes listen on port 80 and therefore cause this error if you try to listen on port 80 from Node.js or any other app.



You can turn off that behaviour in Skype by accessing the options and clicking Advanced -> Connection -> Use port 80 (Untick this)



Turn off Skype port 80 usage





P.S. After making that change, don't forget to restart Skype!
– Rob Evans
Apr 12 '13 at 12:08





This is one of the most dumbfounding design flaws I've ever seen. How insane are the Skype devs that they would ever consider taking over 80 or 443?
– AJB
Sep 21 '15 at 21:35





Big +1 for your debugging skills though, Rob.
– AJB
Sep 21 '15 at 21:35





@AJB They did it to try and punch through firewalls that limit outbound traffic to http requests, but where the firewalls aren't using DPI so just do basic port blocking. Still... it's a bit silly to enable this by default!
– Rob Evans
Sep 22 '15 at 10:52





To down-voters, if you are going to downvote... please explain why in a comment.
– Rob Evans
Dec 18 '15 at 11:00



You should try killing the process that is listening on port 80.



Killall will kill all the node apps running. You might not want to do that. With this command you can kill only the one app that is listening on a known port.



If using unix try this command:


sudo fuser -k 80/tcp





Thanks Yaki. killall node failed for me but this worked.
– Pat M
Oct 8 '16 at 19:19





Thanks! killall and lsof -i didn't work for me, but this did.
– karfus
Oct 25 '16 at 5:43





You might not want to kill all the node apps running.
– Yaki Klein
Oct 25 '16 at 7:35





Thanks. it worked for me
– Gangadhar Jannu
Mar 19 at 8:12



Another thing that can give this error, is two HTTP servers in the same node code. I was updating some Express 2 to Express 3 code, and had this...


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



And, it triggered this error.



pkill node before running your script should do the job.


pkill node





pgrep node before hand if you want to be a little careful and see what node processes are running
– Josh.F
Apr 27 '16 at 4:22


pgrep node


node





Totally!, I was talking in case it was a container or very controlled place for the process.
– Javier Cobos
May 1 '17 at 6:39



Your application is already running on that port 8080 .
Use this code to kill the port and run your code again


sudo lsof -t -i tcp:8080 | xargs kill -9





thanks it helped
– Harry
Feb 15 at 8:13



EADDRINUSE means that the port(which we try to listen in node application) is already being used. In order to overcome, we need to identify which process is running with that port.


EADDRINUSE



For example if we are trying to listen our node application in 3000 port. We need to check whether that port is already is being used by any other process.



step1:


$sudo netstat -plunt |grep :3000



That the above command gives below result.


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



step2:



Now you got process ID(25315), Kill that process.


kill -9 25315



step3:


npm run start



Note: This solution for linux users.



I have the same problem too,and I simply close the terminal and open a new terminal and run


node server.js



again. that works for me, some time just need to wait for a few second till it work again.



But this works only on a developer machine instead of a server console..



This error comes when you have any process running on a port on which you want to run your application.



how to get which process running on that port=>
command:
sudo netstat -ap | grep :3000



output : you will get the process information which is using that port



tcp 0 0 IPaddress:3000 : LISTEN 26869/node



Now you can kill that process
sudo kill -9 26869



Error: listen EADDRINUSE means the port which you want to assign/bind to your application server is already in use. You can either assign another port to your application.



Or if you want to assign the same port to the app. Then kill the application that is running at your desired port.



For a node application what you can try is, find the process id for the node app by :


ps -aux | grep node



After getting the process id, do


kill process_id





-aux on windows 10 ?
– Tom Stickel
Jul 15 '17 at 7:42





No -aux is for linux based systems. For windows based systems you can look up the system montior for the desired node process and end it.
– Parth Vyas
Jul 15 '17 at 7:45





right - i was trying to comment on that gracefully. thx
– Tom Stickel
Jul 15 '17 at 7:57



I have seen this error before (in node) with http.client, and as I recall, the problem had to do with not initializing the httpClient or setting bad options in the httpClient creation and/or in the url request.





If I do the request befor I start the server, then it works
– Danny Fox
Mar 27 '12 at 22:11



On Debian i found out to run on port 80 you need to issue the command as root i.e


sudo node app.js



I hope it helps



While killing the NODE_PORT, it might kill your chrome process or anything that is listening to the same port, and that's annoying.



This shell script may be helpful - in my case the port is 1337 but you can change it anytime


# 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



In my case I use a web hosting but it´s the same in local host, I used:


ps -aef | grep 'node'



for watch the node process then, the console shows the process with PID.
for kill the process you have to use this command:


kill -9 PID



where PID is the process id from the command above.



Two servers can not listen on same port, so check out if other server listening on same port, also check out for browser sync if its running on same port



For other people on windows 10 with node as localhost and running on a port like 3500, not 80 ...


localhost



What does not work:


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



What shows information but still not does work:


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



What does work:



Git Bash or Powershell on Windows


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



Notice the PID ( far right )
I could not get killall to work... so


killall



Now after that not so fun exercise on windows, I realized I can use task manager and find the Node engine and just end it.



FYI , I was using Visual Studio Code to run Node on port 3500, and I use Git Bash shell inside VS code. I had exited gracefully with Ctrl + C , but sometimes this does not kill it. I don't want to change my port or reboot so this worked. Hopefully it helps others. Otherwise it is documentation for myself.



The option which is working for me :



Run:


ps -ax | grep node



You'll get something like:


8078 pts/7 Tl 0:01 node server.js
8489 pts/10 S+ 0:00 grep --color=auto node
kill -9 8078



The error EADDRINUSE (Address already in use) reports that there is already another process on the local system occupying that address / port.


EADDRINUSE



There is a npm package called find-process which helps finding (and closing) the occupying process.



Here is a little demo code:


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



I prepared a small sample which can reproduce the EADDRINUSE error. If you launch the following program in two separate terminals, you will see that the first terminal will start a server (on port "3000") and the second terminal will close the already running server (because it blocks the execution of the second terminal, EADDRINUSE):


EADDRINUSE


EADDRINUSE



Minimal Working Example:


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}"...`))



In my case Apache HTTP Server was run on port 80 I solved it by issue the command as root



sudo killall httpd


sudo killall httpd



Update



If Jenkin is installed and running on your Mac;


sudo lsof -i tcp:8080


sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist



I had this issue and resolved by changing the port number (select free port)



Windows


set PORT=5000



Mac


export PORT=5000



if you want to solve this



$ node server events.js:141
throw er; // Unhandled 'error' event
^



Error: listen EADDRINUSE :::3000
at Object.exports._errnoException (util.js:907:11)
at exports._exceptionWithHostPort (util.js:930:20)
at Server._listen2 (net.js:1250:14)
at listen (net.js:1286:10)
at Server.listen (net.js:1382:5)
at EventEmitter.listen (C:sendboxmeannode_modulesexpresslibapplication .js:617:24)
at Object. (C:sendboxmeanserver.js:28:5)
at Module._compile (module.js:409:26)
at Object.Module._extensions..js (module.js:416:10)
at Module.load (module.js:343:32)



change your port number to 8000



Windows is always tricky with open source..



change the port simply it works


node-inspector --web-port=8099





you probably should explain what you are doing.... like they should do an npm install ... then .....
– Tom Stickel
Jul 15 '17 at 7:40



For windows users execute the following command in PowerShell window to kill all the node processes.


Stop-Process -processname node



I would prefer doing



killall -15 node


killall -15 node



because, kill -15 gives process a chance to cleanup itself.
Now, you can verify by


kill -15



ps aux | grep node


ps aux | grep node



Note: If you don't give process a chance to finish what it is currently doing and clean up, it may lead to corrupted files



EADDRINUSE translates to "The port you are trying to issue app.listen() on is being used by other programs". You can use a script like this to check if your port is in use and then change the port in your 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);
}



You can add other errors in the errors array to check for all sorts of error types as well.



In my case rebooting ubuntu was helpfull.





Rebooting ubuntu just closed the application which was earlier listening on port 80. This reboot was unnecessary. You could have just killed that application instead.
– Haywire
Sep 22 '15 at 17:24




Thank you for your interest in this question.
Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).


Would you like to answer one of these unanswered questions instead?

Comments

Popular posts from this blog

paramiko-expect timeout is happening after executing the command

how to run turtle graphics in Colaboratory

Export result set on Dbeaver to CSV