如果我运行一个端口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

进入任务管理器(或使用快捷键Ctrl + Shift + Esc) 在“后台进程”中,找到“Node.js”进程并终止它们(右键单击它们并选择“结束任务”)

现在你应该可以重新开始了

其他回答

真正帮助我的是:

killall -9 node

但是这会杀死一个系统进程。

ps ax

你可以检查它是否有效。

这个选项对我来说是有效的:

Run:

ps -ax | grep node

你会得到这样的东西:

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

查看哪些进程正在使用该端口也很有用。

对于macOS,我从这篇文章中发现,AirPlay使用端口5000,所以即使你使用这里列出的解决方案杀死它,它也会再次使用端口5000。快速搜索谷歌,查看哪些常见应用程序或进程正在使用导致错误的端口。

EADDRINUSE表示端口(我们在节点应用程序中尝试侦听的端口)已经被使用。为了克服这个问题,我们需要确定哪个进程正在使用该端口运行。

例如,如果我们试图在3000端口监听节点应用程序。我们需要检查该端口是否已经被任何其他进程使用。

步骤1:

$sudo netstat -plunt |grep :3000

上面的命令给出下面的结果。

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

步骤2:

现在您获得了进程ID(25315),杀死该进程。

kill -9 25315

步骤3:

npm run start

注意:此解决方案适用于linux用户。

错误EADDRINUSE(地址已在使用)报告本地系统上已经有另一个进程占用该地址/端口。

有一个叫做find-process的npm包可以帮助查找(并关闭)占用进程。

下面是一个小演示代码:

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

我准备了一个小样本,可以重现EADDRINUSE错误。如果你在两个不同的终端上启动下面的程序,你会看到第一个终端将启动一个服务器(在端口“3000”上),而第二个终端将关闭已经运行的服务器(因为它阻止了第二个终端EADDRINUSE的执行):

最小工作示例:

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