如果我运行一个端口80的服务器,我尝试使用XMLHttpRequest,我得到这个错误

为什么NodeJS会有问题,如果我想做一个请求,而我在端口80上运行一个服务器?对于网络浏览器来说,这不是问题:我可以在服务器运行时上网。

服务器为:

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

请求是:

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

当前回答

错误原因:您正在尝试使用繁忙的端口号

Windows/Mac有两种可能的解决方案

空闲当前使用的端口号 为当前程序选择另一个端口号

1. 空闲端口号

窗户

1. netstat -ano | findstr :4200
2. taskkill /PID 5824 /F

Mac

你可以试试netstat

netstat -vanp tcp | grep 3000

对于OSX El Capitan和更新版本(或者如果你的netstat不支持-p),使用lsof

sudo lsof -i tcp:3000

如果这不能解决您的问题,Mac用户可以参考关于此问题的完整讨论,查找(并杀死)Mac上的进程锁定端口3000

2. 修改端口号?

窗户

set PORT=5000

Mac

export PORT=5000

其他回答

EADDRINUSE翻译过来就是“你试图发出app.listen()的端口正在被其他程序使用”。您可以使用这样的脚本来检查端口是否正在使用,然后在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);
}

您还可以在errors数组中添加其他错误,以检查所有类型的错误。

尝试这两个命令,它将停止所有节点进程。

killall 9 node
pkill node
npm start 

对于windows 10上的其他人来说,node是localhost,端口是3500,而不是80…

不奏效的:

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

显示信息但仍然不起作用的:

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

哪些方法有效:

Git Bash或Windows上的Powershell

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

注意PID(最右边) 我不能让所有人都去工作……所以

打开任务管理器 在进程选项卡上,右键单击名称或任何列,并选择包含PID 按PID排序,然后右键单击右PID,然后单击结束任务。

现在,在windows上不那么有趣的练习之后,我意识到我可以使用任务管理器,找到Node引擎,然后结束它。

仅供参考,我使用Visual Studio代码在端口3500上运行节点,我在VS代码中使用Git Bash shell。我已经用Ctrl + C优雅地退出了,但有时这并不能杀死它。我不想改变我的端口或重新启动,所以这是有效的。希望它能帮助到其他人。否则就是我自己的文档。

在我的情况下,Apache HTTP服务器运行在端口80上,我通过发出命令作为根来解决它

Sudo杀死所有HTTPD

更新

如果Jenkin已经安装并运行在你的Mac上;

可以使用sudo lsof -i tcp:8080进行检查 如果是,并且您只想停止Jenkins一次,请执行:sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist

当杀死NODE_PORT时,它可能会杀死你的chrome进程或任何侦听相同端口的东西,这很烦人。

这个shell脚本可能会有帮助——在我的例子中,端口是1337,但您可以随时更改它

# 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