如何修复错误:在使用nodejs时听EADDRINUSE?

时间:2012-03-27 22:00:59

标签: javascript node.js

如果我使用端口80运行服务器,并尝试使用xmlHTTPrequest,我会收到此错误:Error: listen EADDRINUSE

为什么在我在端口80上运行服务器时,如果我想做一个请求,nodejs会出现问题?对于web浏览器来说,这不是问题:我可以在互联网上冲浪,而服务器正在运行。

服务器是:

  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();

41 个答案:

答案 0 :(得分:491)

对我来说真正有用的是:

killall -9 node

但这会杀死系统进程。

ps ax

你可以查看它是否有效。

答案 1 :(得分:382)

EADDRINUSE表示listen()尝试绑定服务器的端口号已在使用中。

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

如果您在此端口上运行另一个Web服务器,则必须将node.js放在该服务器后面并通过它进行代理。

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

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

答案 2 :(得分:247)

Patrick提出的上述killall -9 node按预期工作并解决了问题,但您可能希望阅读此答案的编辑部分,了解为什么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 - 实际上不要。请继续阅读下面的内容):

kill -9 57385

您可以阅读有关此here的更多信息。

编辑:我今天正在阅读一个相当相关的主题,偶然发现why should i not kill -9 a process上有趣的帖子。

  

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

所以,如上所述,您最好使用以下方法终止上述过程:

kill -15 57385

编辑2 :多次noted in a comment around here此错误是由于未正常退出流程而造成的。这意味着,很多人使用 CTRL + Z 退出节点命令(或任何其他命令)。停止正在运行的进程的正确方法是发出执行干净退出的 CTRL + C 命令。

以正确的方式退出进程将在关闭时释放该端口。这将允许您重新启动该过程,而无需在自己再次重新运行之前自行终止它。

答案 3 :(得分:58)

只是抬头,Skype有时会在端口80上侦听,因此如果您尝试从Node.js或任何其他应用程序侦听端口80,则会导致此错误。

您可以通过访问选项并点击高级 - >来关闭Skype中的这种行为。连接 - >使用端口80(取消此功能)

Turn off Skype port 80 usage

  

P.S。进行此更改后,请不要忘记重新启动Skype!

答案 4 :(得分:34)

您应该尝试终止正在侦听端口80的进程。

Killall会杀死正在运行的所有节点应用。你可能不想这样做。使用此命令,您只能杀死正在侦听已知端口的一个应用程序。

如果使用unix,请尝试以下命令:

sudo fuser -k 80/tcp    

答案 5 :(得分:18)

  

错误原因:您正在尝试使用忙碌port number

在Windows / Mac上解决此问题有两种可能的解决方案

  1. 目前免费使用的端口号
  2. 选择当前程序的其他端口号
  3. <小时/>

    1。自由港号码

    <强>窗

    1. netstat -ano | findstr :4200
    2. taskkill /PID 5824 /F
    

    enter image description here

    <强>苹果

    您可以尝试使用netstat

    netstat -vanp tcp | grep 3000
    

    对于OSX El Capitan和更新版(或者如果你的netstat不支持-p),请使用lsof

    sudo lsof -i tcp:3000
    

    如果这不能解决您的问题,Mac用户可以参考有关此问题的完整讨论Find (and kill) process locking port 3000 on Mac

    <小时/>

    2。更改端口号?

    <强>窗

    set PORT=5000
    

    <强>苹果

    export PORT=5000
    

答案 6 :(得分:17)

在控制器环境下,您可以使用:

pkill node在运行脚本之前应该完成这项工作。

请记住,此命令会终止所有node进程,如果您只有一个容器只运行一个实例,那么这可能是正确的,我们您可以保证这样做。

在任何其他情况下,我建议使用命令以编程方式查找您找到的某个进程ID或名称。就像你的进程被调用一样,node-server-1你可以做pkill node-server-1

此资源可能有助于理解: https://www.thegeekstuff.com/2009/12/4-ways-to-kill-a-process-kill-killall-pkill-xkill/

答案 7 :(得分:15)

您的应用程序已在该端口8080上运行。 使用此代码终止端口并再次运行代码

sudo lsof -t -i tcp:8080 | xargs kill -9

答案 8 :(得分:15)

另一件可能导致此错误的事情是同一节点代码中的两个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')); 
});                                                                   

并且,它触发了这个错误。

答案 9 :(得分:14)

这对我有效(我使用的是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]

答案 10 :(得分:9)

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用户。

答案 11 :(得分:5)

尝试这两个命令,它将停止所有节点进程。

killall 9 node
pkill node
npm start 

答案 12 :(得分:5)

  

sudo kill $(sudo lsof -t -i:80)

强行杀死

  

sudo kill -9 $(sudo lsof -t -i:80)

使用cmd以上的命令杀死特定端口,然后运行服务器

答案 13 :(得分:4)

当您要在运行应用程序的端口上运行任何进程时,会出现此错误。

如何在该端口上运行哪个进程=&gt; 命令:  sudo netstat -ap | grep:3000

输出:您将获得使用该端口的进程信息

tcp 0 0 IPaddress:3000 LISTEN 26869 / node

现在你可以杀死那个过程了 sudo kill -9 26869

答案 14 :(得分:4)

EADDRINUSE表示您的nodejs应用程序的端口已在使用中。

  • 现在您已经终止了在该端口上运行的进程/应用程序。
  • 通过以下方式查找应用的进程ID:
  

lsof -i tcp:3000

  • 现在您将从中获取进程ID。
  • 运行此:
  

杀死-9 processId

答案 15 :(得分:3)

我也有同样的问题,我只需关闭终端并打开一个新终端并运行

node server.js

一次。这对我有用,有些时候只需要等待几秒钟再重复一次。

但这仅适用于开发人员计算机而非服务器控制台..

答案 16 :(得分:3)

在下面的命令中替换您的端口号

sudo lsof -t -i tcp:portNumber | xargs kill -9

答案 17 :(得分:2)

在我的情况下,Apache HTTP Server在端口80上运行,我通过以root身份发出命令来解决它

sudo killall httpd

更新

如果在Mac上安装并运行Jenkin,

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

答案 18 :(得分:2)

我在使用http.client之前(在节点中)看到过这个错误,并且我记得,问题与不在httpClient创建和/或url请求中初始化httpClient或设置错误选项有关。 / p>

答案 19 :(得分:2)

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

ps aux|grep node

并退出:

kill -9 <NodeProcessId>

或交替使用

ng serve --port <AnotherFreePortNumber>

在您选择的免费端口上提供项目服务。

答案 20 :(得分:2)

有一种使用任务管理器终止该过程的方法:

  

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

  1. 转到任务管理器(或使用快捷键 Ctrl + Shift + Esc

  2. 在“后台进程”上,找到“ Node.js”进程并终止它们(右键单击它们,然后选择“结束任务”)

enter image description here

  1. 现在您应该可以重新开始

答案 21 :(得分:2)

在Debian上我发现在端口80上运行你需要以root身份发出命令,即

sudo node app.js

我希望它有所帮助

答案 22 :(得分:1)

这发生在我身上,因为我的服务器在另一个终端窗口中运行。断开连接可以解决问题。

答案 23 :(得分:1)

lsof -i:3000;
kill -9 $(lsof -t -i:3000);
// 3000 is a your port

答案 24 :(得分:1)

我知道了

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

我正在尝试寻找侦听端口8000的进程
而且没有运气-没有运气
sudo netstat -nlp | grep 8000)。

事实证明,我在脚本中写了两次app.listen(8000)

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

答案 25 :(得分:1)

错误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错误。如果在两个单独的终端中启动以下程序,您将看到第一个终端将启动服务器(在端口&#34; 3000&#34;),第二个终端将关闭已在运行的服务器(因为它阻止执行第二个终端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}"...`))

答案 26 :(得分:1)

我最近有同样的问题。

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

在我的情况下,我不小心在2个终端上运行了express,因此使用'Ctrl + C'退出终端对我来说是固定的。 (仅从一个终端运行服务器)

希望对别人有帮助。

答案 27 :(得分:1)

我更喜欢做

killall -15 node

因为,kill -15为进程提供了清理自己的机会。 现在,您可以通过

进行验证

ps aux | grep node

注意:如果您没有让进程有机会完成当前正在进行的操作并进行清理,则可能会导致文件损坏

答案 28 :(得分:1)

对我有用的选项:

执行命令

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

答案 29 :(得分:1)

对于Windows 10上节点为org.apache.spark.sql.execution.datasources.InsertIntoHadoopFsRelationCommand$$anonfun$run$1$$anonfun$apply$mcV$sp$1.apply(InsertIntoHadoopFsRelationCommand.scala:143) at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:70) at org.apache.spark.scheduler.Task.run(Task.scala:86) at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:274) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.IllegalStateException: This consumer has already been closed. 且在3500端口上运行的其他人,而不是80 ...

什么行不通:

localhost

什么显示信息,但仍然不起作用:

killall    ?  command not found
ps -aux | grep 'node'     ?     ps:  user x unknown 

有什么作用:

Windows上的Git Bash或Powershell

 ps -aef | grep 'node'
 ps ax
 kill -9 61864

注意PID(最右边)
我无法让 net -a -o | grep 3500 (whatever port you are looking for) 工作......所以

  1. 打开任务管理器
  2. 在进程选项卡上,右键单击名称或任何列,然后选择包含PID
  3. 按PID排序,然后右键单击右侧PID并单击结束任务。
  4. 现在,在Windows上运行不那么有趣之后,我意识到我可以使用任务管理器找到Node引擎并结束它。

    仅供参考,我使用Visual Studio Code在端口3500上运行Node,我在VS代码中使用Git Bash shell。我已经用Ctrl + C优雅地退出了,但有时这并没有杀死它。我不想更改我的端口或重启,所以这有效。希望它能帮助别人。否则它是我自己的文档。

答案 30 :(得分:1)

两台服务器无法在同一端口上侦听,因此请检查其他服务器是否在同一端口上侦听,如果在同一端口上运行,则还要检查浏览器同步

答案 31 :(得分:1)

在我的情况下,我使用网络托管,但在本地主机中它是相同的,我用过:

ps -aef | grep 'node' 

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

kill -9 PID

其中PID是上述命令的进程ID。

答案 32 :(得分:1)

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

答案 33 :(得分:0)

EADDRINUSE转换为“正在尝试发布app.listen()的端口正被其他程序使用”。您可以使用这样的脚本来检查您的端口是否正在使用,然后更改app.listen()中的端口。

var net = require('net');
var errors = ['EADDRINUSE'];    
var isUsed = function(port) {
    var tester = net.createServer()
        .once('error', function (err) {
          if (!errors.includes(err.code)) {
           console.log("Port is in use, change the port.");
          }
        })
        .once('listening', function() {
            tester.once('close', function() { 
                console.log("You are good to go."); 
            })
            .close()
        })
        .listen(port);
}

您可以在errors数组中添加其他错误,以检查各种错误类型。

答案 34 :(得分:0)

当我们在同一实例中不小心使两个本地Express环境指向同一端口时,解决了此错误。

如果您的答案列表太少,希望对您有所帮助并解决您的问题。

答案 35 :(得分:0)

对于 Windows用户,在PowerShell窗口中执行以下命令以终止所有节点进程。

Stop-Process -processname node

答案 36 :(得分:0)

开源时Windows总是很棘手..

改变端口只是它的工作原理

node-inspector --web-port=8099

答案 37 :(得分:0)

NOOB 错误修复:我是 Node.js 的新手,并设置了一个监听端口 8080 的网络服务器。我遇到了 EADDRINUSE 错误。我尝试了所有各种“kill -9 节点”迭代并不断得到“节点:未找到进程”

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

如果您在尝试终止端口时收到“未找到进程”响应,请尝试检查以确保您只打开了一次端口。

答案 38 :(得分:0)

在 ZSH 中,当我输入 exit 时,我注意到一条消息:zsh: you have suspended jobs

  1. 输入单词 jobs,点击 enter
  2. 输入 kill %1(其中 %1 是作业编号),点击 enter
  3. 响应应说明 terminated {job_name}

我找到了答案here

答案 39 :(得分:-1)

阅读了一篇小文章here.

后,我的问题已解决

答案 40 :(得分:-1)

如果你想解决这个问题

  

$ node server events.js:141         扔掉//未处理的'错误'事件         ^

     

错误:听EADDRINUSE ::: 3000       at Object.exports._errnoException(util.js:907:11)       at exports._exceptionWithHostPort(util.js:930:20)       在Server._listen2(net.js:1250:14)       在听(net.js:1286:10)       在Server.listen(net.js:1382:5)       在EventEmitter.listen(C:\ sendbox \ mean \ node_modules \ express \ lib \ application .js:617:24)       在对象。 (C:\ sendbox \平均\ server.js:28:5)       在Module._compile(module.js:409:26)       at Object.Module._extensions..js(module.js:416:10)       在Module.load(module.js:343:32)

将您的端口号更改为8000