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.js
和server1.js
这两个文件,并且它们具有相同的端口号(8000),当npm run server
时,就会出现错误。
看来nodemon默认会自动运行server.js
。尽管我在 package.json 中只有"server": "npx nodemon server1.js"
,但当我的终端执行npm run server
命令时,nodemon 同时运行server.js
和server1.js
。
由于server.js
和server1.js
具有相同的端口号,导致错误发生。
同理,如果我们只有server.js
,nodemon自动运行server.js
,然后根据package.json
脚本运行server.js
,就会报错。
希望这会有所帮助。如果这适用于您的应用程序,请随时告诉我。
【讨论】:
“解决此问题的最快和直接的方法”不是重新启动计算机。您已经完全解决了问题的根源,并进行了创可贴修复。 你是个天才 这不应该是一个答案。请删除它。【参考方案6】:我是如何解决的,因为我没有在那个端口上运行任何东西,它仍然给了我错误。要清除的终止节点是缓存:
pkill nodejs
或 pkill 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