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

当前回答

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

其他回答

这适用于我(我使用mac)。执行此命令

lsof -PiTCP -sTCP:LISTEN

这将显示系统正在使用的端口列表。找到您的节点正在运行的PID

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)

运行kill -9 [YOUR_PID]

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

Sudo杀死所有HTTPD

更新

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

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

在我的情况下,我使用一个虚拟主机,但它在本地主机是一样的,我使用:

ps -aef | grep 'node' 

对于节点进程的监视,控制台用PID显示进程。 要杀死进程,你必须使用这个命令:

kill -9 PID

其中PID是上面命令中的进程id。

我最近也遇到了同样的问题。

这意味着该端口已经被另一个应用程序(express或其他软件)使用。

在我的情况下,我不小心在2个终端上运行express,所以使用“Ctrl + C”退出终端为我解决了问题。(只从一个终端运行服务器)

希望它能帮助别人。

只是一个头,Skype有时会监听端口80,因此导致这个错误,如果你试图从Node.js或任何其他应用程序监听端口80。

你可以在Skype中通过访问选项并单击高级->连接->使用端口80(取消勾选)来关闭该行为

P.S.在做了这个改变后,不要忘记重新启动Skype!