首页 文章

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

提问于
浏览
358

如果我使用端口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();

30 回答

  • 1

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

    对我有用的是:

    killall -9 node
    

    但这会破坏系统进程 .

    ps ax
    

    你可以检查它是否有效 .

  • 7

    前面提到的 killall -9 node ,Patrick的工作按预期工作并解决了问题,但您可能想要阅读这个答案的编辑部分,关于为什么 kill -9 可能不是最好的方法 .

    最重要的是,您可能希望定位 single 进程而不是盲目地杀死 all 活动进程 .

    在这种情况下,首先获取在该端口上运行的进程的进程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 - 实际上 do not . 请继续阅读下面的内容):

    kill -9 57385

    你可以阅读更多关于这个here的内容 .

    EDIT: 我今天正在阅读一个相当相关的话题,并在why should i not kill -9 a process上偶然发现了这个有趣的话题 .

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

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

    kill -15 57385

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

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

  • 15

    **在下行之前 - 请阅读答案 . 这是相关的!如果你要对此进行投票,请留下评论,为什么你认为它不相关 .


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

    您可以通过访问选项并单击高级 - >连接 - >使用端口80(取消此操作)来关闭Skype中的行为

    Turn off Skype port 80 usage

  • 2

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

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

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

    sudo fuser -k 80/tcp
    
  • 347

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

  • 227

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

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

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

    而且,它触发了这个错误 .

  • 2

    这对我有用(我正在使用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]

  • 441

    错误原因:您正在尝试使用繁忙的端口号

    There are two options to resolve this issue in Windows/Mac

    • 免费当前使用的端口号

    • 为当前程序选择另一个端口号

    1.免费端口号

    Windows

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

    enter image description here

    Mac

    你可以试试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.更改端口号?

    Windows

    set PORT=5000
    

    Mac

    export PORT=5000
    
  • 0

    EADDRINUSE 表示已经在使用端口(我们尝试在节点应用程序中侦听) . 为了克服这个问题,我们需要确定哪个进程正在运行该端口 .

    例如,如果我们试图在3000端口中监听我们的节点应用程序 . 我们需要检查该端口是否已被任何其他进程使用 .

    step1:

    $sudo netstat -plunt |grep :3000
    

    以上命令给出了以下内容结果 .

    tcp6       0      0 :::3000                 :::*                    LISTEN      25315/node
    

    step2:

    现在您获得了进程ID(25315),杀死了该进程 .

    kill -9 25315
    

    step3:

    npm run start
    

    注意:此解决方案适用于linux用户 .

  • 33

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

    强行杀死

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

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

  • 1

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

    如何获取在该端口上运行的进程=> command:sudo netstat -ap | grep:3000

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

    tcp 0 0 IPaddress:3000:LISTEN 26869 / node

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

  • 3

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

    node server.js
    

    再次 . 这对我有用,有些时候只需要等待几秒钟直到它再次工作 .

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

  • 4

    Error: listen EADDRINUSE 表示您要分配/绑定到应用程序服务器的端口已在使用中 . 您可以为应用程序分配另一个端口 .

    或者,如果要将相同的端口分配给应用程序 . 然后终止在所需端口上运行的应用程序 .

    对于节点应用程序,您可以尝试的是,通过以下方式查找节点应用程序的进程ID:

    ps -aux | grep node
    

    获取进程ID后,执行

    kill process_id
    
  • 1

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

  • 9

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

    sudo node app.js
    

    我希望它有所帮助

  • 0

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

    sudo killall httpd

    Update

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

    • 你可以用 sudo lsof -i tcp:8080 查看

    • 如果是,并且您只想停止一次Jenkins,请运行: sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist

  • 5

    似乎还有另一个Node ng服务进程正在运行 . 通过在控制台(Linux / Mac)中键入它来检查它:

    ps aux|grep node
    

    并退出:

    kill -9 <NodeProcessId>
    

    或者替代使用

    ng serve --port <AnotherFreePortNumber>
    

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

  • 2

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

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

    ps -aef | grep 'node'
    

    然后,为了监视节点进程,控制台用PID显示进程 . 要杀死你必须使用此命令的进程:

    kill -9 PID
    

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

  • 56

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

  • 3

    对于Windows 10上的其他人,节点为 localhost 并在像3500这样的端口上运行,而不是80 ...

    What does not work:

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

    What shows information but still not does work:

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

    What does work:

    Windows上的Git Bash或Powershell

    net -a -o | grep 3500   (whatever port you are looking for)
    

    注意PID(最右边)
    我无法工作......所以

    • 打开任务管理器

    • 在进程选项卡上,右键单击名称或任何列,然后选择包含PID

    • 按PID排序,然后右键单击右侧PID并单击结束任务 .

    在那之后,在Windows上不那么有趣的练习,我意识到我可以使用任务管理器并找到Node引擎并结束它 .

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

  • 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
    
  • 13

    错误 EADDRINUSE (已在使用的地址)报告本地系统上已有另一个进程占用该地址/端口 .

    有一个名为find-process的npm包,它有助于查找(和关闭)占用过程 .

    Here is a little demo code:

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

    Minimal Working Example:

    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}"...`))
    
  • 2

    我更喜欢这样做

    killall -15 node

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

    ps aux | grep node

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

  • 15

    我最近遇到了同样的问题 .

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

    在我的情况下,我不小心在两个终端上运行快递,所以使用'Ctrl C'退出终端为我修复了一些东西 . (仅从一个终端运行服务器)

    希望它能帮助别人 .

  • 1

    在下面的命令中替换你的portNumber

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

    Windows开源时总是很棘手..

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

    node-inspector --web-port=8099
    
  • 1

    对于 windows users ,在PowerShell窗口中执行以下命令以终止所有节点进程 .

    Stop-Process -processname node
    

相关问题