380 Stimmen

Node.js EACCES-Fehler beim Lauschen auf den meisten Ports

Ich teste eine App (die hoffentlich auf Heroku laufen soll, aber ich habe auch lokal Probleme). Es gibt mir einen EACCES-Fehler, wenn es http.Server.listen() läuft - aber es tritt nur auf einigen Ports.

Ich bin also auf der Flucht:

joe@joebuntu:~$ node
> var h = require('http').createServer();
> h.listen(900);
Error: EACCES, Permission denied
    at Server._doListen (net.js:1062:5)
    at net.js:1033:14
    at Object.lookup (dns.js:132:45)
    at Server.listen (net.js:1027:20)
    at [object Context]:1:3
    at Interface.<anonymous> (repl.js:150:22)
    at Interface.emit (events.js:42:17)
    at Interface._onLine (readline.js:132:10)
    at Interface._line (readline.js:387:8)
    at Interface._ttyWrite (readline.js:564:14)

Auf Port 900 (oder einem der anderen 20 Ports, die ich ausprobiert habe) läuft nichts, also sollte das funktionieren. Das Seltsame daran ist, dass es tut an einigen Häfen arbeiten. Zum Beispiel funktioniert Port 3000 perfekt.

Was könnte die Ursache dafür sein?

Aktualisierung 1:

Ich habe herausgefunden, dass auf meinem lokalen Computer der EACCES-Fehler auftritt, weil ich node als Root ausführen muss, um mich an diese bestimmten Ports zu binden. Ich weiß nicht, warum das passiert, aber die Verwendung von sudo behebt das Problem. Dies erklärt jedoch nicht, wie ich das Problem auf Heroku beheben würde. Es gibt keine Möglichkeit, Node als Root auf Heroku auszuführen, wie kann ich also auf Port 80 lauschen?

57voto

Ridwan Malik Punkte 406

Wenn Sie Folgendes verwenden Windows . Sie sollten einen Neustart versuchen Windows NAT-Treiberdienst .

Öffnen Sie Eingabeaufforderung als Verwalter und laufen

net stop winnat

dann

net start winnat

Das war's.

Das passiert, weil ich Folgendes installiert habe Nord VPN und es wurde automatisch mit Windows gestartet.

15voto

luffy Punkte 136

Spoiler-Alarm: Diese Antwort mag ein wenig komisch erscheinen.

Ich habe mehr als 10 Minuten damit verbracht, die Ursache für diesen Fehler in meinem System herauszufinden. Ich habe dies verwendet: PORT=2000; in meiner .env-Datei.

Ich hoffe, Sie haben es schon herausgefunden. Ich hatte ein Semikolon nach der Angabe der PORT-Nummer verwendet :'( Ich habe das zusätzliche Zeichen entfernt und es funktionierte.

Ich weiß, dass dies vielleicht keine Antwort auf diese Frage ist, aber ich hoffe, es hilft anderen, die das gleiche Problem haben.

10voto

eleven Punkte 6702

Ein anderer Ansatz ist die Umleitung von Ports:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 900 -j REDIRECT --to-port 3000

Und lassen Sie Ihren Server auf einem Port >1024 laufen:

require('http').createServer().listen(3000);

Das Gleiche kann übrigens auch für den https(443)-Port gemacht werden.

7voto

OMG!! In meinem Fall habe ich ....listen(ip, port) anstelle von ...listen(port, ip) und das hat die Fehlermeldung ausgelöst: Error: listen EACCES localhost

Ich habe Portnummern >= 3000 verwendet und es sogar mit Admin-Zugang versucht. Nichts hat funktioniert. Bei genauerem Hinsehen bemerkte ich dann das Problem. Ich änderte es auf ...listen(port, ip) und alles funktionierte wieder einwandfrei!!

Ich rufe dies nur auf, falls es für jemand anderen nützlich ist...

6voto

Fusseldieb Punkte 1183

Ich hatte ein ähnliches Problem, dass es sich weigerte, auf Port 8080 zu laufen, aber auch cualquier andere.

Es stellte sich heraus, dass es daran lag, dass die env.local Datei enthielt Kommentare nach den Variablennamen wie:

PORT=8080 # The port the server runs at

Und er hat es so interpretiert, dass er versucht, den Port " 8080 # The port the server runs at ", was offensichtlich ein ungültiger Port ist (-1). Das Entfernen der Kommentare löste das Problem vollständig.

Ich verwende übrigens Windows 10 und Git Bash.


Ich weiß, es ist nicht genau das hier beschriebene Problem, aber es könnte jemandem da draußen helfen. Ich bin auf diese Frage gestoßen, als ich nach dem Problem für meine Antwort gesucht habe, also... vielleicht?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X