Dacă am rula un server cu port 80, și încerc să folosesc xmlHTTPrequest primesc aceasta eroare: Eroare: asculta EADDRINUSE
De ce este o problemă pentru nodejs, dacă vreau să fac o cerere, în timp ce rula un server pe portul 80? Pentru webbrowsers nu este o problema: nu mai pot naviga pe internet, în timp ce serverul se execută.
Serverul este:
net.createServer(function (socket) {
socket.name = socket.remoteAddress + ":" + socket.remotePort;
console.log('connection request from: ' + socket.remoteAddress);
socket.destroy();
}).listen(options.port);
Și cererea:
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
înseamnă că numărul portului pe care ascultă()` încearcă să-l lega la serverul este deja în uz.
Deci, în cazul dumneavoastră, nu trebuie să ruleze un server pe portul 80 deja.
Dacă aveți un alt server de web care rulează pe acest port trebuie să pună node.js în spatele proxy server și prin ea.
Ar trebui să verificați pentru "ascultare" astfel de eveniment, pentru a vedea dacă server-ul este într-adevăr ascultare:
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);
Menționate mai sus killall -9 nod
, a sugerat de către Patrick funcționează cum era de așteptat și rezolvă problema, dar poate doriți să citiți edita o parte din acest răspuns despre ce kill -9
nu poate fi cel mai bun mod de a face asta.
Pe partea de sus de care ați putea dori pentru a viza un single proces mai degrabă decât orbește uciderea toate procese active.
În acest caz, în primul rând a obține identificatorul de proces (PID) de procesele care rulează pe acel port (să zicem 8888):
lsof-i tcp:8888
Acest lucru va reveni ceva de genul:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 57385 You 11u IPv6 0xac745b2749fd2be3 0t0 TCP *:ddi-tcp-1 (LISTEN)
Apoi fă (ps - de fapt nu. Vă rugăm să păstrați lectură de mai jos):
kill -9 57385
Puteți citi mai multe despre acest aici.
EDIT: am citit pe un destul legate de subiect astăzi și dat peste acest fir interesant pe de ce să nu kill -9
un proces.
în General, ar trebui să utilizați ucide -15 înainte kill -9 să dea țintă proces o șansă de a curăța după sine. (Procese pot't prinde sau ignora SIGKILL, dar ele pot și de multe ori nu prinde SIGTERM.) Dacă tu nu't da proces o șansă de a termina ceea ce-l's faci și curat, se poate lăsa corupt fișiere (sau alt stat) jur că nu o't fi capabil să înțeleagă odată repornit.
Deci, după cum am menționat, ar trebui să mai omoare procesul de mai sus cu:
`ucide -15 57385``
EDIT 2: Fi a menționat într-un comentariu aici de mai multe ori această eroare este o consecință a nu ieși dintr-un proces cu grație. Asta înseamnă că, o mulțime de oameni ieșiți dintr-un nod de comandă (sau orice alt), folosind CTRL+Z. Modul corect de a opri un proces de funcționare se eliberează CTRL+C, comandă care efectuează o ieșire.
Ieșirea dintr-un proces în mod corect va elibera acel port în timp ce închiderea. Acest lucru vă va permite să reporniți procesul fără a trece prin probleme de a ucide singur, înainte de a fi în măsură să re-rula din nou.
Doar un cap's up, Skype, uneori, va asculta pe portul 80 și, prin urmare, că această eroare dacă încercați pentru a asculta pe portul 80 de la Node.js sau orice altă aplicație.
Puteți dezactiva acest comportament în Skype prin accesarea opțiuni și faceți clic Avansat -> Conexiune -> Utilizați portul 80 (Debifați acest lucru)
P. S. După ce face această schimbare, don't uitați să reporniți Skype!
Ar trebui să încercați uciderea proces care este de a asculta pe portul 80.
Killall va ucide toate nod aplicații care rulează. S-ar putea să nu vrei să faci asta. Cu aceasta comanda te poate ucide doar o singură aplicație, care este de a asculta pe un cunoscut port.
Dacă utilizați unix încercați această comandă:
sudo fuser -k 80/tcp
Sub un controlor de mediu, ai putea folosi:
pkill nod
înainte de a rula script-ul dvs. ar trebui să facă treaba.
Bear în minte această comandă va ucide toate nod
procese, care ar putea fi bine dacă am.e un recipient care rulează doar un exemplu, aveți un astfel de mediu în cazul în care vă poate garanta asta.
În orice alt scenariu, am recomandăm să utilizați o comandă pentru a ucide un anumit proces id-ul sau numele găsite prin căutarea pentru el în mod programatic. ca în cazul în care procesul este numit, nod-server-1 ai putea să faci pentru pkill nod-server-1`.
Această resursă ar putea fi util pentru a înțelege: https://www.thegeekstuff.com/2009/12/4-ways-to-kill-a-process-kill-killall-pkill-xkill/
Eroare motiv: sunteți încercarea de a utiliza ocupată, numărul de port`
Există două soluții posibile pentru a rezolva această problemă pe Windows/Mac
Windows
1. netstat -ano | findstr :4200
2. taskkill /PID 5824 /F
Mac
Puteți încerca netstat
netstat -vanp tcp | grep 3000
Pentru OSX El Capitan și mai noi (sau dacă netstat nu't-suport p), utilizarea lsof
sudo lsof -i tcp:3000
dacă aceasta nu rezolvă problema, "Mac", utilizatorii pot referi la discuție completă despre această problemă https://stackoverflow.com/questions/3855127/find-and-kill-process-locking-port-3000-on-mac
Windows
set PORT=5000
Mac
export PORT=5000
Un alt lucru care poate da aceasta eroare, este de două servere HTTP din același nod cod. Am fost actualizarea unor Express 2 să-și Exprime 3 cod, și a avut...
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'));
});
Și, acesta a declanșat această eroare.
Aceasta funcționează și pentru mine (m-am'm folosind mac). Rulați această comandă
lsof -PiTCP -sTCP:ASCULTA
Acest lucru's de gând pentru a afișa o listă de porturi că syetem este folosind. Găsi PID
ca nod se execută
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)
și a alerga kill -9 [YOUR_PID]
EADDRINUSE
înseamnă că portul(pe care vom încerca să asculte în nod cerere) este deja utilizat. În scopul de a depăși, trebuie să identificăm care procesul se execută cu acel port.
De exemplu, dacă încercăm să asculte noastre nod aplicarea în 3000 de port. Trebuie să verificați dacă portul este deja este folosit de către orice alt proces.
$sudo netstat -plunt |grep :3000
Care comanda de mai sus oferă mai jos rezultatul.
tcp6 0 0 :::3000 :::* LISTEN 25315/node
Acum ai ID-ul de proces(25315), Ucide acest proces.
kill -9 25315
npm run start
Notă: Această soluție pentru utilizatorii de linux.
Această eroare apare atunci când aveți orice proces care rulează pe un port pe care doriți să rula aplicația dumneavoastră.
cum să obțineți în care procesul care rulează pe acel port=> comanda: sudo netstat -ap | grep :3000
ieșire : veți obține informații proces care utilizează acel port
tcp 0 0 IPaddress:3000 : ASCULTA 26869/nod
Acum puteți ucide acest proces sudo kill -9 26869
EADDRINUSE înseamnă portul de nodejs aplicația este deja în uz.
lsof-i tcp:3000
kill -9 processId
În comanda de mai jos înlocui numărport
sudo lsof -t -i tcp:portNumber | xargs kill -9
Eroare: asculta EADDRINUSE înseamnă că portul pe care doriți să o asociați/lega la serverul de aplicații este deja în uz. Puteți fie să atribuie un alt port la cererea dumneavoastră.
Sau dacă doriți să atribuiți același port la app. Apoi ucide aplicații care se execută la portul dorit.
Pentru un nod de aplicare ce poti incerca este, găsi id-ul de proces pentru nodul app de :
ps -aux | grep node
Dupa ce procesul de id-ul, nu
kill process_id
Eu am aceeași problemă,și eu pur și simplu aproape de terminal și de a deschide un nou terminal și a alerga
node server.js
din nou. care lucrează pentru mine, de ceva timp trebuie doar să așteptați câteva secunde până să funcționeze din nou.
Dar aceasta funcționează doar pe un producător de mașini în loc de o consola serverului..
Există o modalitate de a termina procesul, folosind Task Manager:
Rețineți că această soluție este numai pentru Windows
Du-te la Task Manager (sau folosind shortcut Ctrl + Schimbare + Esc)
Pe "Procesele de Fundal", găsi "Nod.js" procese și de a le termina (clic-Dreapta ei și alegeți "End Task")