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

当前回答

NOOB错误修复:我是Node.js的新手,并设置了一个监听端口8080的web服务器。我遇到EADDRINUSE错误。我尝试了所有不同的“杀死-9节点”迭代,并一直得到,“节点:没有发现进程”

问题是,我在调用http.listen(8080);在同一段代码中出现了两次。所以第一次它实际上工作得很好,第二次它抛出一个错误。

如果在尝试关闭端口时得到“no process found”响应,请尝试检查以确保只打开一次端口。

其他回答

解决方法:

1:需要使用以下命令终止进程。

pm2 kill <PROCESS_ID>

2:执行如下命令重新启动服务。

启动app.js——name“servername”

3:执行以下命令检查服务器状态。

pm2列表

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

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

EADDRINUSE意味着listen()尝试绑定服务器的端口号已经在使用中。

因此,在您的情况下,必须已经在端口80上运行服务器。

如果你有另一个web服务器在这个端口上运行,你必须把node.js放在那个服务器后面,并通过它来代理它。

你应该像这样检查监听事件,看看服务器是否真的在监听:

var http=require('http');

var server=http.createServer(function(req,res){
    res.end('test');
});

server.on('listening',function(){
    console.log('ok, server is running');
});

server.listen(80);

当杀死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

有一种方法可以使用任务管理器终止进程:

注意,此解决方案仅适用于Windows

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

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