代码之家  ›  专栏  ›  技术社区  ›  Skawful

Node/Express:EADDRINUSE,地址已在使用-终止服务器

  •  314
  • Skawful  · 技术社区  · 14 年前

    var server = require('connect').createServer();
    //actions...
    server.listen(3000);
    

    在我的代码中,我有实际的处理程序,但这是基本的想法。我一直遇到的问题是

    EADDRINUSE, Address already in use
    

    当应用程序在以前崩溃或出现错误后再次运行时,我收到此错误。因为我没有打开终端的新实例,所以我用 ctr + z .

    我非常确定我所要做的就是关闭服务器或连接。我打过电话 server.close() 在里面 process.on('exit', ...); 没有运气。

    28 回复  |  直到 14 年前
        1
  •  136
  •   Tor Valamo    14 年前

    process.on('exit', ..) 如果进程崩溃或被终止,则不调用。它只在事件循环结束时调用,并且 server.close() 某种程度上 结束事件循环(它仍然需要等待当前运行堆栈在这里和那里)这是没有意义的把它放在退出事件…

    撞车时,做 process.on('uncaughtException', ..) 在杀人的时候 process.on('SIGTERM', ..)

        2
  •  452
  •   djburdick    14 年前

    也可以通过命令行路径:

    ps aux | grep node
    

    以获取进程ID。

    kill -9 PID
    

    在kill上执行-9将发送一个SIGKILL(而不是SIGTERM)。 有时节点会忽略SIGTERM。

        3
  •  162
  •   Mina Gabriel    7 年前

    首先,你想知道哪个进程正在使用 port 3000

    sudo lsof -i :3000
    

    这将列出所有 监听这个端口,一旦你有了 PID控制 您可以使用以下命令终止它:

    kill -9 {PID}
    
        4
  •  143
  •   rsjaffe    8 年前

    我在运行win8的笔记本上点击了这个。这奏效了。

    以“管理员”身份运行cmd.exe:

    C:\Windows\System32>taskkill /F /IM node.exe
    SUCCESS: The process "node.exe" with PID 11008 has been terminated.
    
        5
  •  65
  •   Ayan    7 年前

    使用以下命令检查端口3000上运行的进程的PID即id:

    lsof -i tcp:3000
    

    COMMAND  PID   USER   FD   TYPE  DEVICE  SIZE/OFF NODE NAME
    node     5805  xyz    12u  IPv6  63135    0t0     TCP  *:3000 (LISTEN)
    

    现在使用以下命令终止进程:

    kill -9 5805
    
        6
  •  36
  •   Balaji Rajendran    6 年前

    我找到了这个解决方案,试试看 允许使用 sudo

      sudo pkill node
    
        7
  •  27
  •   Cody Gray    5 年前

    Linux系统

    跑步 ps

    然后,跑 sudo kill PID

    窗户

    tasklist /O
    

    然后,像这样终止节点进程(使用从 tasklist 命令):

    taskkill /pid PID
    
        8
  •  18
  •   Kit    9 年前

    有一次我犯了这个错误,在这里采取了很多方法。

    我的问题是我有两个 app.listen(3000); 调用相同的app.js脚本。 第一个app.listen()成功,第二个引发错误。

    另一个帮助我调试的有用命令是 sudo fuser -k 3000/tcp 这将杀死您可能已经启动的任何恶意进程(有些进程可能会重新启动,例如,如果使用forever.js运行,但这对我很有用)。

        9
  •  16
  •   floribon    6 年前

    这是一个一行程序(用端口或配置变量替换3000):

    kill $(lsof -t -i:3000)
    
        10
  •  12
  •   Shahdat    6 年前

    对于windows,打开任务管理器并查找node.exe进程。用结束任务杀死他们。

    enter image description here

        11
  •  11
  •   Daniyal    5 年前
    ps aux | grep node
    kill -9 [PID] (provided by above command)
    

    说明:


    1. ps将给出进程状态,aux提供列表a:所有用户进程,u:用户自己的进程,x:所有其他进程不附加到终端。
    2. 管道符号:|将传递ps aux的结果以进一步操作。
    3. grep将从ps aux提供的列表中搜索提供的字符串(在本例中是节点)。
        12
  •  10
  •   var foobar    7 年前

    PowerShell用户:

    Taskkill/IM node.exe/F

        13
  •  9
  •   Asclepius    8 年前

    仅供参考,您可以在一个命令中终止进程 sudo fuser -k 3000/tcp

        14
  •  9
  •   ejntaylor    6 年前

    首先找出正在运行的内容:

    sudo lsof -nP -i4TCP:3000 | grep LISTEN
    

    你会得到如下信息:

    php-fpm 110 root    6u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)
    php-fpm 274 _www    0u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)
    php-fpm 275 _www    0u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)
    

    然后可以按如下方式终止该进程:

    sudo kill 110
    

    然后你就可以在不获取listen EADDRINUSE:::3000个错误的情况下运行了

        15
  •  7
  •   jmrueda    6 年前

    对于Visual Studio Noobs

    您可能正在其他终端中运行该进程!

    之后 关闭 Visual Studio ,终端只是 .

    手动 新航站楼 我其实是 新的 在以前的基础上

    所以我找到了第一个终端。。。喂,我在那里运行服务器。

    multiple terminals withot realizying it

        16
  •  6
  •   Idan Yehuda    9 年前

    任务管理器(ctrl+alt+del)->

    选择“node.exe”进程并点击“结束进程”

        17
  •  5
  •   Adam Gerard    5 年前

    你可能会遇到这样的情况:即使杀死线程或进程也不会真正终止应用程序(在Linux和Windows上,这种情况偶尔会发生)。有时你可能已经有一个实例在运行,但你没有关闭它。

    package.json :

    "scripts": {
        "stop-win": "Taskkill /IM node.exe /F",
        "stop-linux": "killall node"
    },
    

    然后,我可以用以下方式给他们打电话:

    npm run stop-win
    npm run stop-Linux
    

        18
  •  4
  •   touchStone    11 年前

    您可以使用热节点来防止服务器崩溃/运行时错误。每当节点程序[源]/进程[运行节点程序]发生更改时,热节点会自动为您重新启动nodejs应用程序。

    使用npm使用全局选项安装热节点:

    npm安装-g hotnode

        19
  •  4
  •   Amal Augustine Jose elp    7 年前

    关于表格中的所有答案,我想补充一点。

    我发现,当我使用Ctrl+Z错误地终止一个节点应用程序时,下一次当我试图打开它时,也会遇到同样的错误EADDRINUSE。

    将端口号更改为错误端口号以外的其他端口号解决了该问题。

        20
  •  3
  •   Arun Killu    7 年前

    以防万一,看看你是否加了这一行 倍数 错误的次数

    app.listen(3000, function() {
      console.log('listening on 3000')
    });
    

        21
  •  3
  •   rofrol    7 年前

    在Linux上。

    将函数添加到 ~/.bashrc

    function killTcpListen () {
      kill -9 $(lsof -sTCP:LISTEN -i:$1 -t)
    }
    

    拉动更改: source ~/.bashrc

    使用它: killTcpListen 3000

        22
  •  3
  •   vapurrmaid    7 年前

    我有一个package.json脚本来启动节点: "start": "node index.js"

    每当我使用这个,不管我是否用ctrl+c杀死它,我都会遇到这个问题。

    如果我只是跑 node index.js npm run start 用ctrl+c终止,我从来没有得到这个错误。

    我不知道为什么,但我想这可能会有帮助。

        23
  •  2
  •   Maksim Vi.    11 年前

    节点正在内存中的某个位置运行,并已锁定该端口。在Windows上,这个问题会发生,就像大多数Windows问题一样,通过点击 + 中高音 + 和/或重新启动。

        24
  •  1
  •   Vish    9 年前

    出现这些问题的原因是:

    1. 任何一个应用程序都可能在这个端口上运行,如Skype。
    2. 您可能已尝试启动多个服务器。为了解决这个问题,可以维护一个布尔值来检查服务器是否已经启动。只有当布尔值返回false或undefined时才应该启动它;
        25
  •  1
  •   Andreas Bigger    5 年前

    await server.close();
    

    重要: 使用时 ,我们必须使用 异步 我们封装函数中的关键字如下:

    async () => {
      await server.close();
    }
    
        26
  •  0
  •   shadrack Mwangi    8 年前

        27
  •  0
  •   ankhzet    7 年前

    我想知道,为什么还没有人提到这种可能性:

    • 如果你提供 ::listen(port) -1 ,ant然后引擎将尝试连接到 端口,然后产生相同的 EADDRINUSE 嗨,我xD

    所以, 在开始检查使用端口的进程之前,调试代码并检查传递给函数的确切内容 .

        28
  •  0
  •   Irfan Raza    6 年前

    对于所有来到这篇文章并尝试了所有可能会使用nodemon或永远这样做。 例如,如果您运行 PORT=6060 Nodemon

    如果是这样的话,如果您真的需要在运行期间定义端口,请在没有nodemon的情况下运行您的项目。或者,如果您想坚持使用nodemon,可以在文件本身中定义端口。

    PORT=6060 node app.js

        29
  •  0
  •   Anfuca    5 年前

    对我来说,是因为我打开了Eclipse。。。

        30
  •  0
  •   Bernardo Dal Corno    5 年前

    只杀死使用给定端口的节点进程。正如其他人提到的,在bash中可以使用 kill $(lsof -t -i:PORT)

    这是一个Windows解决方案(有办法!): netstat -bona | findstr ".0:PORT +0.0.0.0:0 +LISTENING" | for /f "tokens=5" %t in ('more') do taskkill /PID:%t /F . 为此,您需要一个提升的终端(在VSCode中,由于集成终端无法提升,您需要用提升打开自身)。

    PS:如果 findstr find 并将“+”替换为空格(非正则表达式模式)