Nodemon:错误:监听 EADDRINUSE:地址已在使用 :::5000

Posted

技术标签:

【中文标题】Nodemon:错误:监听 EADDRINUSE:地址已在使用 :::5000【英文标题】:Nodemon: Error: listen EADDRINUSE: address already in use :::5000 【发布时间】:2020-07-25 14:57:28 【问题描述】:

我正在创建一个项目并使用 nodejs,表示后端。 一切正常,但是当我对文件进行任何更改时,nodemon 由于以下错误而无法重新启动服务器:

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

index.js:

const express = require("express");
const morgan = require("morgan");
const mongoose = require("mongoose");
const cookieParser = require("cookie-parser");
const session = require("express-session");
const FileStore = require("session-file-store")(session);
const dotenv = require("dotenv");
var passport = require("passport");

dotenv.config();

const PORT = process.env.PORT || 5000;

const app = express();

.....

app.listen(PORT, () => console.log(`Server listening on port $PORT!`));

package.json


  "name": "chat-app-backend",
  "version": "0.0.0",
  "private": true,
  "scripts": 
    "start": "node index.js",
    "dev": "nodemon --ignore 'sessions/' index.js"
  ,
  "dependencies": 
    "bcryptjs": "^2.4.3",
    "cookie-parser": "^1.4.5",
    "cors": "^2.8.5",
    "debug": "~2.6.9",
    "dotenv": "^8.2.0",
    "express": "~4.16.0",
    "express-session": "^1.17.0",
    "http-errors": "~1.6.2",
    "jade": "~1.11.0",
    "jsonwebtoken": "^8.5.1",
    "mongoose": "^5.9.4",
    "morgan": "~1.9.0",
    "passport": "^0.4.1",
    "passport-jwt": "^4.0.0",
    "passport-local": "^1.0.0",
    "passport-local-mongoose": "^6.0.1",
    "session-file-store": "^1.4.0",
    "uuid": "^7.0.2"
  ,
  "devDependencies": 
    "nodemon": "^2.0.2"
  

我每次都必须从终端显式终止服务器,这不是最佳解决方案。 我尝试了几件事,但没有一个有效。甚至在nodemon GitHub问题页面中发现了一些问题,但我也找不到任何东西。

我还添加了 lsof -i:5000 的输出,即使服务器我正在关闭服务器 - *node 31625 rishav 20u IPv6 5300049 0t0 TCP : 5000(听)

【问题讨论】:

请尝试将端口从 5000 更改为 5555 等其他端口 我试过这个,它有时会奏效。但我仍然不明白为什么会发生此错误 能否提供dotenv使用的.env文件? 这很可能是因为 nodemon 重启服务器的速度比 KILL 信号快。 根据我的经验这个错误,@akkhil 似乎是最正确的。我保存,用 nodemon 重新启动服务器。我有时会遇到同样的错误。 不做更改,我再次保存文件,它重新启动,我可能得到错误。它可能需要多次保存/重新启动才能正常工作。 【参考方案1】:

您的端口在其他地方使用。很可能,您在运行新节点之前忘记停止先前的节点实例。

【讨论】:

不是它没有运行,每当我启动nodemon,然后保存文件就会发生错误 另外,我只在 3000 端口上运行前端服务器,除了 5000 上什么都没有运行。我检查了好几次 在运行新的 Node 实例之前,请检查您打开的端口和服务:sudo ss -tulpn | grap LISTEN 我遇到了似乎没有其他进程在监听端口的情况,我发布了我的解决方案作为答案。原来我在我的脚本中写了两次app.listen(8000)【参考方案2】:

您可以尝试在 3000 等其他端口上运行您的服务器。

如果您仍然想使用相同的端口,那么您可以使用以下命令获取该特定端口上正在运行的进程列表:

lsof -i tcp:3000 

在终端中使用以下命令终止该正在运行的端口:

sudo kill -9 $(lsof -i tcp:3000 -t)

【讨论】:

【参考方案3】:

我明白了:

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

我试图寻找监听 8000 端口的进程 并且没有运气 - 没有 (sudo netstat -nlp | grep 8000)。

结果是我在脚本中写了两次app.listen(8000)

我的假设是在尝试运行脚本时干扰仅在短时间内发生,因此在错误之前和之后寻找侦听端口的进程没有显示任何内容。

【讨论】:

谢谢。那是我犯的一个愚蠢的错误!【参考方案4】:

我也有同样的情况。如果您使用的是 Visual Studio Code,请检查您的终端。您可能有其他终端实例已经在运行您的节点服务器。

【讨论】:

这是 OP 需要的确切答案,因为这对我来说也是如此!谢谢,我忘了检查其他终端实例。 就我而言,我忘记停止使用端口的调试。谢谢! 不是所有的超级英雄都穿斗篷! 我退出了 VSC,它现在可以工作了。但我相信这是因为已经打开了其他一些终端实例,然后我关闭了它,但实际上并没有杀死该实例。因此,即使您没有看到终端,也可能有另一个实例影响它。【参考方案5】:

我遇到了同样的问题,每次保存文件时都会发生错误。

** 于 2021 年 3 月 18 日更新**

对我来说,解决此问题最快最直接的方法是重新启动计算机。 我确信即使我重新打开 VS 编辑器,nodemon 仍在某个地方运行,这会导致地址冲突。 这个问题在我的案例中发生过几次。 我仍在试图找出问题的根源。这不是一个完美的解决方案。

** 结束 **

我需要退出 nodemon 模式,找出 PID,然后将其杀死。这不是一个好的解决方案,因为它很麻烦,并且会阻止我在终端中获取调试日志。

但是我找到了另一种解决问题的方法,只需将文件名从server.js更改为另一个名称(例如,我尝试了server1.js),还更改了package.json文件中的脚本。 ("server": npx nodemon server1.js),最后运行npm run server

之前:

这是我所做的:

    将文件名从server.js更改为server1.js。 将package.json 文件中的脚本从"server": "npx nodemon server.js" 更改为"server": "npx nodemon server1.js"$ npm run server

之后:

我知道这是一个奇怪的解决方案,可能是我的计算机或 nodemon 包有问题,但最终,它确实对我有用,文件名很重要。

这是我发现的一个有趣的观察结果 2020 年 11 月 1 日:

    如果您同时拥有server.jsserver1.js 这两个文件,并且它们具有相同的端口号(8000),当npm run server 时,就会出现错误。 看来nodemon默认会自动运行server.js。尽管我在 package.json 中只有"server": "npx nodemon server1.js",但当我的终端执行npm run server 命令时,nodemon 同时运行server.jsserver1.js。 由于server.jsserver1.js 具有相同的端口号,导致错误发生。 同理,如果我们只有server.js,nodemon自动运行server.js,然后根据package.json脚本运行server.js,就会报错。

希望这会有所帮助。如果这适用于您的应用程序,请随时告诉我。

【讨论】:

“解决此问题的最快和直接的方法”不是重新启动计算机。您已经完全解决了问题的根源,并进行了创可贴修复。 你是个天才 这不应该是一个答案。请删除它。【参考方案6】:

我是如何解决的,因为我没有在那个端口上运行任何东西,它仍然给了我错误。要清除的终止节点是缓存:

pkill nodejspkill node 取决于操作系统/版本

还可以使用fuser -k 8000/tcp 立即终止任何端口。 (Linux)

【讨论】:

【参考方案7】:

如果你正在处理一个文件 > 保存它 > 然后得到错误试试这个:

重新保存您更改过一次或两次的文件,问题就会消失 每次都是我。

保存文件一次:

Error: listen EADDRINUSE: address already in use :::5000
...
[nodemon] app crashed - waiting for file changes before starting...

保存文件几秒钟(不做任何更改)[command]+ s

[nodemon] restarting due to changes...
[nodemon] starting `node app.js`
Server is running on port: 5000

【讨论】:

【参考方案8】:

我在使用 vscode 时遇到了同样的情况。快速“双重保存”cmd-c 大部分时间都有效。

【讨论】:

【参考方案9】:

我用这个来解决同样的问题

process.once('SIGUSR2', 
  function ()  
    process.kill(process.pid, 'SIGUSR2'); 
  
);

https://www.npmjs.com/package/nodemon 控制脚本的关闭

【讨论】:

【参考方案10】:

我认为当我在没有事先关闭 nodemon 的情况下关闭服务器终端时会发生错误。

然后,通常在第二天,nodemon 就会开始表现得很奇怪。

我是如何解决的: 我注意到,在运行 ps -fp $(grep -u my_username) 时,我启动并运行了几个 nodemon 实例。所以我做了 pkill -f nodemon,它杀死了所有 nodemon 实例,然后重新启动了 nodemon,在我的 Linux 服务器的美妙领域中一切都恢复了。

【讨论】:

正如 incolas 提到的,运行 pkill -f nodemon 帮助了我。我一直试图简单地单独杀死端口,但这只会导致临时修复。该问题会在几次保存后返回... 为我工作。非常感谢!【参考方案11】:

我的解决方案很简单

    假设 ex:- 当前端口为 4000,然后将其更改为 4001。

相信我,它会起作用的,不要寻找一个大的解决方案。如果现有端口号的问题将其更改为不同,只要您的应用程序运行没有问题

【讨论】:

【参考方案12】:

--delay 帮助我解决了这两个问题

自动重启

停在ctrl-c

nodemon --delay 500ms app.js

我还补充说:

process.once('SIGUSR2', function () 
  process.kill(process.pid, 'SIGUSR2');
);

process.on('SIGINT', function () 
  // this is only called on ctrl+c, not restart
  process.kill(process.pid, 'SIGINT');
);

【讨论】:

这正是为我做的!尝试了很多其他的东西.. 这也为我做了!尝试了很多其他的东西.. 工作就像魅力!【参考方案13】:

请尝试升级您的节点版本。它对我有用。

【讨论】:

服务器无法绑定端口,这很可能意味着该端口上正在运行其他进程。它肯定与节点版本无关。【参考方案14】:

nodemon 的重启速度可能比进程被杀死的速度更快。例如,如果在 server.on('close')server.on('SIGINT') 上执行的代码太慢,就会发生这种情况。

我的解决方案不太令人满意,因为我不知道它为什么会起作用,但它确实对我有用。我在 package.json 中的 nodemon 脚本之前声明了端口号,并将其从 server.js 中的 PORT 声明中删除:

尝试替换:

const PORT = process.env.PORT || 5000;

通过

const PORT = process.env.PORT;

"server": "nodemon server"

通过

"server": "PORT=5000 nodemon server"

【讨论】:

【参考方案15】:

上述所有解决方案都不适合我。 我每次都必须这样做:

npx kill-port 5000

【讨论】:

【参考方案16】:

出于某种原因,所有答案都建议与 nodemon 修复分开。要正确重新启动服务器,您需要使用正确的信号将其关闭(终止)。您可以使用--signal 标志指定信号。例如:

nodemon --exec go run main.go --signal SIGTERM

在您的特定示例中,这将是:

nodemon --ignore 'sessions/' index.js --signal SIGTERM

Gracefully reloading down your script 下的更多内容。

【讨论】:

【参考方案17】:

当我有这个脚本"start": "nodemon app.js"时,我遇到了同样的问题 但后来我把脚本改成了"server" : "npx nodemon app.js"

解决了这个问题。

【讨论】:

【参考方案18】:

您可以尝试使用--spawn 标志或spawn:true 设置,这将使用spawn 而不是fork。这个解决方案有一个缺点:nodemon 在被SIGKILL 杀死时会留下僵尸子进程,但是它仍然会在下次运行时终止僵尸进程。

nodemon --spawn --ignore 'sessions/' index.js

https://github.com/remy/nodemon/pull/1249

【讨论】:

【参考方案19】:

我遇到了这个错误,我一直在杀死在所需端口上运行的进程,

$ sudo kill -9 $(lsof -i tcp:<port number> -t

每次我重新启动服务器时,都会删除 nodemon 的主要用途。然后我列出了在我的计算机上运行的所有进程,使用

$ ps aux

然后搜索在我的计算机上运行的所有节点应用程序,然后发现我的节点应用程序在后台运行,然后使用它的 pid 杀死它。

$ sudo kill -9 pid

这为我解决了错误。 发生错误是因为在这期间我失去了与服务器的连接,然后当我重新登录时打开了一个新终端。

【讨论】:

【参考方案20】:

也许其他一些服务正在该端口上运行。如果没有什么适合你的,你可以试试这个。

fuser -k [端口]/tcp

例如

定影器-k 8080/tcp

【讨论】:

【参考方案21】:
sudo pkill node

它将终止所有正在运行的服务器

【讨论】:

【参考方案22】:

我看到了很好的回应,他们似乎解决了问题。

我遇到了同样的问题,希望我的回答能帮助像我这样的人,我还没有意识到以下几点:

查看我点击上面的“调试”链接的 package.json 文件

"scripts:" 
"dev": "nodemon src / app.js"

控制台是在visual studio code中自动打开的,我不记得服务器已经从操作系统控制台运行了。

那是我的错。

【讨论】:

【参考方案23】:

如果全局使用 -g 选项,请尝试 npm i nodemon@debug 如果可行,请支持此 PR:https://github.com/remy/nodemon/pull/1938

【讨论】:

【参考方案24】:

一个新的可能原因是因为在 macOS Monterey (12.0) 中,使用端口 5000 并由进程名称 ControlCenter 表示的“AirPlay Receiver”默认处于打开状态。你可以这样关闭它:

    打开系统偏好设置 进入“分享” 取消选中左侧列表底部的“AirPlay 接收器”。

更多详情here.

您还可以在不同的端口上运行您的服务器,例如 3000。

【讨论】:

【参考方案25】:

如果你想使用已经在运行的端口,你可以简单地用这个命令杀死它:

kill -9 $(lsof -t -i:portnumber)

在你的情况下,如果端口号=5000,那么你可以运行:

kill -9 $(lsof -t -i:5000)

【讨论】:

【参考方案26】:

我最近在使用端口 3000 处理 node.js 项目的 vscode 中遇到了这个问题。 在终端输入:

npx kill-port 3000 

【讨论】:

以上是关于Nodemon:错误:监听 EADDRINUSE:地址已在使用 :::5000的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS 错误 events.js:182 throw er; // 未处理的“错误”事件 ^ 错误:监听 EADDRINUSE :::3000 [重复]

错误 - Windows Powershell 中的未知监听 EADDRINUSE :::5432

未捕获的错误:在 mocha 单元测试时监听 EADDRINUSE:地址已在使用 :::3000

节点:事件:304 错误:监听 EADDRINUSE:地址已在使用 :::5000

Nodejs & socket io:警告 - 引发错误:错误:监听 EADDRINUSE

错误:监听 EADDRINUSE:地址已在使用 :::3000 试图在节点 js 中运行服务器 [重复]