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

其他回答

另一个可能产生此错误的是相同节点代码中的两个HTTP服务器。我正在更新一些Express 2到Express 3的代码,然后有了这个…

http.createServer(app).listen(app.get('port'), function(){            
  console.log('Express server listening on port ' + app.get('port')); 
});        

// tons of shit.

http.createServer(app).listen(app.get('port'), function(){            
  console.log('Express server listening on port ' + app.get('port')); 
});                                                                   

它触发了这个错误。

两个服务器不能侦听同一端口,所以检查其他服务器是否侦听同一端口,也检查浏览器同步是否运行在同一端口上

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

ps -aef | grep 'node' 

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

kill -9 PID

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

上文提到的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命令,该命令执行干净的退出。

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

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