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

当前回答

似乎有另一个Node ng服务进程正在运行。在你的控制台(Linux/Mac)中输入以下内容进行检查:

ps aux|grep node

然后用:

kill -9 <NodeProcessId>

或替代使用

ng serve --port <AnotherFreePortNumber>

在你选择的自由港口为你的项目服务。

其他回答

这适用于我(我使用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]

如果你想解决这个问题

$ node server events.js:141 throw er; // Unhandled 'error' event ^ Error: listen EADDRINUSE :::3000 at Object.exports._errnoException (util.js:907:11) at exports._exceptionWithHostPort (util.js:930:20) at Server._listen2 (net.js:1250:14) at listen (net.js:1286:10) at Server.listen (net.js:1382:5) at EventEmitter.listen (C:\sendbox\mean\node_modules\express\lib\application .js:617:24) at Object. (C:\sendbox\mean\server.js:28:5) at Module._compile (module.js:409:26) at Object.Module._extensions..js (module.js:416:10) at Module.load (module.js:343:32)

将端口号更改为8000

我有:

Error: listen EADDRINUSE: address already in use :::8000

我试图寻找侦听端口8000的进程 没有运气-没有(sudo netstat -nlp | grep 8000)。

结果我在我的脚本中写了两次app.listen(8000)。

我的假设是,在尝试运行脚本时,干扰只在很短的时间内发生,因此在错误前后查找侦听端口的进程不会显示任何干扰。

上文提到的kill -9节点,由Patrick建议,正如预期的那样工作并解决了问题,但你可能想要阅读这个回答的编辑部分,关于为什么kill -9可能不是最好的方法。

最重要的是,您可能希望以单个进程为目标,而不是盲目地杀死所有活动进程。

在这种情况下,首先获取该端口上运行的进程的进程ID (PID)(例如8888):

Lsof -i tcp:8888

这将返回如下内容:

COMMAND   PID    USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node     57385   You   11u  IPv6 0xac745b2749fd2be3      0t0  TCP *:ddi-tcp-1 (LISTEN)

然后就去做(ps -实际上不做。请继续阅读下文):

杀死-9 57385

你可以在这里读到更多。

编辑:我今天正在阅读一个相当相关的主题,偶然发现了这个有趣的帖子,关于为什么我不应该杀死-9个进程。

通常,应该在kill -9之前使用kill -15,以便给目标进程一个自我清理的机会。(进程不能捕获或忽略SIGKILL,但它们可以并且经常捕获SIGTERM。)如果您不给进程一个机会来完成它正在做的事情和清理,它可能会留下损坏的文件(或其他状态),一旦重新启动,它将无法理解。

因此,如前所述,你应该更好地杀死上面的进程:

击杀-15 57385

编辑2:正如这里的评论多次指出的那样,此错误是由于没有优雅地退出进程造成的。这意味着,许多人使用CTRL+Z退出节点命令(或任何其他命令)。停止正在运行的进程的正确方法是发出CTRL+C命令,该命令执行干净的退出。

以正确的方式退出进程将在关闭时释放该端口。这将允许您重新启动进程,而不必在重新运行它之前自己杀死它。

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

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

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

希望它能帮助别人。