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

How to fix Error: listen EADDRINUSE while using nodejs?

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

如果我想要请求,当我在端口80上运行服务器时,为什么nodejs有问题呢? 对于web浏览器来说,这不是问题:在服务器运行时,我可以在互联网上冲浪。

服务器是:

1
2
3
4
5
  net.createServer(function (socket) {
    socket.name = socket.remoteAddress +":" + socket.remotePort;
    console.log('connection request from: ' + socket.remoteAddress);
    socket.destroy();
  }).listen(options.port);

请求:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var xhr = new XMLHttpRequest();

xhr.onreadystatechange = function() {
    sys.puts("State:" + this.readyState);

    if (this.readyState == 4) {
        sys.puts("Complete.
Body length:"
+ this.responseText.length);
        sys.puts("Body:
"
+ this.responseText);
    }
};

xhr.open("GET","http://mywebsite.com");
xhr.send();


对我有用的是:

1
killall -9 node

但这会杀死一个系统进程。

1
ps ax

你可以检查它是否有效。


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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
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);


Patrick提出的上述killall -9 node按预期工作并解决了问题,但您可能希望阅读此答案的编辑部分,了解为什么kill -9可能不是最好的方法。

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

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

lsof -i tcp:8888

这将返回如下内容:

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

然后就做(ps - 实际上没有。请继续阅读下面):

<5233>

你可以在这里阅读更多相关信息。

编辑:我今天正在阅读一个相当相关的主题,偶然发现了这个有趣的线程,为什么我不能kill -9一个过程。

Generally, you should use kill -15 before kill -9 to give the target process a chance to clean up after itself. (Processes can't catch or ignore SIGKILL, but they can and often do catch SIGTERM.) If you don't give the process a chance to finish what it's doing and clean up, it may leave corrupted files (or other state) around that it won't be able to understand once restarted.

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

kill -15 57385

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

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


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

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

Turn off Skype port 80 usage

P.S. After making that change, don't forget to restart Skype!


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

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

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

1
sudo fuser -k 80/tcp


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

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

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

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

此资源可能有助于理解:

4 Ways to Kill a Process – kill, killall, pkill, xkill


Error reason: You are trying to use the busy port number

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

  • 免费当前使用的端口号
  • 为当前程序选择另一个端口号
  • 1.免费端口号码

    视窗

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

    enter image description here

    苹果电脑

    你可以试试netstat

    1
    netstat -vanp tcp | grep 3000

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

    1
    sudo lsof -i tcp:3000

    如果这不能解决您的问题,Mac用户可以参考有关此问题的完整讨论在Mac上查找(和终止)进程锁定端口3000

    2.更改端口号?

    视窗

    1
    set PORT=5000

    苹果电脑

    1
    export PORT=5000


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

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


    另一件可能导致此错误的事情是同一节点代码中的两个HTTP服务器。我正在更新一些Express 2到Express 3代码,并且有这个......

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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'));
    });

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


    这对我有用(我正在使用mac)。运行此命令

    lsof -PiTCP -sTCP:LISTEN

    这将显示您的系统正在使用的端口列表。找到节点正在运行的PID

    1
    2
    3
    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]


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

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

    步骤1:

    1
    $sudo netstat -plunt |grep :3000

    上面的命令给出了以下结果。

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

    第2步:

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

    1
    kill -9 25315

    第3步:

    1
    npm run start

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


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

    强行杀死

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

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


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

    1
    2
    3
    killall 9 node
    pkill node
    npm start

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

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

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

    tcp 0 0 IPaddress:3000:LISTEN 26869 / node

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


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

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

    lsof -i tcp:3000

    • 现在你将从中获得进程ID。
    • 运行这个:

    kill -9 processId


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

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

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

    1
    ps -aux | grep node

    获取进程ID后,执行

    1
    kill process_id


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

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

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

    1
    node server.js

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

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


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

    1
    ps aux|grep node

    并退出:

    1
    kill -9 <NodeProcessId>

    或者替代使用

    1
    ng serve --port <AnotherFreePortNumber>

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


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

    1
    sudo node app.js

    我希望它有所帮助


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


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

    sudo killall httpd

    更新

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

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

  • 对我有用的选项:

    跑:

    1
    ps -ax | grep node

    你会得到类似的东西:

    1
    2
    3
     8078 pts/7    Tl     0:01 node server.js
     8489 pts/10   S+     0:00 grep --color=auto node    
     kill -9 8078

    在杀死NODE_PORT时,它可能会杀死你的chrome进程或任何正在侦听同一端口的东西,这很烦人。

    这个shell脚本可能会有所帮助 - 在我的情况下,端口是1337,但您可以随时更改它

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    # 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显示进程。
    要杀死你必须使用此命令的进程:

    1
    kill -9 PID

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


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


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

    什么行不通:

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

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

    1
    2
    3
     ps -aef | grep 'node'
     ps ax
     kill -9 61864

    什么工作:

    Windows上的Git Bash或Powershell

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

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

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

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


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

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

    这是一个小的演示代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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):

    最小工作范例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    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}"...`))

    我更喜欢这样做

    killall -15 node

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

    ps aux | grep node

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


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

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

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

    希望它能帮助别人。


    这发生在我身上,因为我让我的服务器在另一个终端窗口运行。关闭连接解决了问题。


    1
    2
    3
    4
    5
    6
    lsof -i:3000;
    kill -9 $(lsof -t -i:3000);
    // 3000 is a your port
    // This"lsof -i:3000;" command will show PID
    kill PID
    ex: kill 129393


    Windows开源时总是很棘手..

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

    1
    node-inspector --web-port=8099


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

    Note that this solution is for Windows only

  • 转到任务管理器(或使用快捷方式Ctrl + Shift + Esc)

  • 在"后台进程"中,找到"Node.js"进程并终止它们(右键单击它们并选择"结束任务")

  • enter image description here

  • 现在你应该能够重新开始

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    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数组中添加其他错误,以检查各种错误类型。


    当我们意外地在同一实例中指向同一端口的两个本地Express环境时出现此错误。

    如果你在这个答案列表中有这么远,我希望这将有所帮助并解决你的问题。


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

    1
    Stop-Process -processname node

    如果你想解决这个问题

    $ 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
    ode_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