我正在创建一个项目,并使用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 的输出-节点31625 rishav 20u IPv6 5300049 0t0 TCP *:5000(LISTEN )
答案 0 :(得分:10)
--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');
});
答案 1 :(得分:8)
我认为当我在没有事先关闭 nodemon 的情况下关闭服务器的终端时会发生这个错误。
然后,通常第二天,nodemon 就开始表现得很奇怪。
我是如何解决的: 我注意到在运行 ps -fp $(grep -u my_username) 时,我启动并运行了几个 nodemon 实例。所以我做了 pkill -f nodemon,它杀死了所有的 nodemon 实例,然后重新启动了 nodemon,在我的 Linux 服务器的美妙领域中一切又好起来了。
答案 2 :(得分:6)
我也有同样的情况。如果您使用的是Visual Studio Code,请检查您的终端。您可能还有其他已经在运行节点服务器的终端实例。
答案 3 :(得分:3)
您可以尝试在其他端口(例如3000)上运行服务器。
如果您仍想使用同一端口,则可以使用以下命令来获取该特定端口上正在运行的进程的列表:
lsof -i tcp:3000
在终端中使用以下命令杀死正在运行的端口
sudo kill -9 $(lsof -i tcp: 3000 -t)
答案 4 :(得分:2)
我知道了
Error: listen EADDRINUSE: address already in use :::8000
我正在尝试寻找侦听端口8000的进程
而且没有运气-没有运气(sudo netstat -nlp | grep 8000
)。
事实证明,我在脚本中写了两次app.listen(8000)
。
我的假设是,尝试运行脚本时干扰只是在很短的时间内发生,因此寻找在错误前后监听端口的进程都不会显示任何错误。
答案 5 :(得分:2)
我用这个来解决同样的问题
process.once('SIGUSR2',
function () {
process.kill(process.pid, 'SIGUSR2');
}
);
答案 6 :(得分:2)
有可能 nodemon 重新启动的速度比进程被终止的速度快。例如,如果在 server.on('close')
或 server.on('SIGINT')
上执行的代码太慢,就会发生这种情况。
我的解决方案相当不令人满意,因为我不知道它为什么有效,但它对我有用。我在 package.json
中的 nodemon 脚本之前声明了端口号,并将其从 PORT
中的 server.js
声明中删除:
尝试更换:
const PORT = process.env.PORT || 5000;
由
const PORT = process.env.PORT;
和
"server": "nodemon server"
由
"server": "PORT=5000 nodemon server"
答案 7 :(得分:1)
我有同样的问题,每次保存文件时都会发生错误。
我需要退出nodemon模式,找出PID并杀死它。这不是一个好的解决方案,因为它很麻烦,并且阻止了我在终端中获取调试日志。
但是我找到了另一种解决问题的方法,只需将文件名从server.js
更改为另一个名称(例如,我尝试使用server1.js
),还可以更改包中的脚本.json文件。(“服务器”: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
时,会发生错误。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
,然后根据server.js
脚本运行package.json
,则会发生错误。希望这会有所帮助。请随时告诉我这是否适用于您的应用程序。
答案 8 :(得分:1)
您的端口在其他地方使用。您很可能忘记了在运行新节点之前停止节点的先前实例。
答案 9 :(得分:0)
也许其他一些服务正在该端口上运行。如果没有任何效果,你可以试试这个。
<块引用>fuser -k [端口]/tcp
例如
<块引用>fuser -k 8080/tcp
答案 10 :(得分:0)
我遇到了这个错误,我一直在使用,杀死在所需端口上运行的进程,
$ sudo kill -9 $(lsof -i tcp:<port number> -t}
每次我重新启动服务器时,但这会删除 nodemon 的主要用途。然后我使用
列出了我计算机上运行的所有进程$ ps aux
然后搜索我电脑上运行的所有节点应用程序,然后找到我的节点应用程序在后台运行,然后使用它的pid杀死它。
$ sudo kill -9 pid
这为我解决了错误。 发生错误是因为我在两者之间失去了与服务器的连接,然后当我重新登录时打开了一个新终端。
答案 11 :(得分:0)
您可以尝试使用 --spawn
标志或 spawn:true
设置,这将使用 spawn
而不是 fork
。这种解决方案有一个缺点:nodemon 在用 SIGKILL
杀死时会留下僵尸进程,但它仍然会在下次运行时终止僵尸进程。
nodemon --spawn --ignore 'sessions/' index.js
答案 12 :(得分:0)
我在使用此脚本时遇到了同样的问题 "start": "nodemon app.js"
但后来我把脚本改成了这个 "server" : "npx nodemon app.js"
解决了这个问题。
答案 13 :(得分:0)
出于某种原因,所有答案都建议与 nodemon 修复分开。要正确重新启动服务器,您需要使用正确的信号将其关闭(终止)。您可以使用 --signal
标志指定信号。例如:
nodemon --exec go run main.go --signal SIGTERM
在您的特定示例中,这将是:
nodemon --ignore 'sessions/' index.js --signal SIGTERM
答案 14 :(得分:0)
上述所有解决方案都不适合我。 我只是每次都必须这样做:
npx kill-port 5000
答案 15 :(得分:0)
请尝试升级您的节点版本。它对我有用。
答案 16 :(得分:0)
vscode我也遇到了同样的情况。快速的“双重保存” cmd-c通常可以正常工作。
答案 17 :(得分:0)
如果您正在处理文件>保存它>然后得到errr,请尝试以下操作:
重新保存您所做的更改一次或两次的文件,问题消失了 每次都是我。
保存一次文件:
def fib2(n: int) -> int:
a, b, c = 0, 1, 2
for _ in range(n):
a, b, c = b, c, (c * b) - a
return a
保存文件一秒钟(不做任何更改)[command] + s
Error: listen EADDRINUSE: address already in use :::5000
...
[nodemon] app crashed - waiting for file changes before starting...
答案 18 :(得分:0)
我如何解决它,因为我没有在该端口上运行任何东西,但它仍然给我错误。要清除的杀死节点是具有以下内容的缓存:
pkill nodejs
或pkill node
取决于操作系统/版本
还可以使用fuser -k 8000/tcp
立即终止任何端口。 (Linux)
答案 19 :(得分:-3)
我的解决方案很简单
相信我,它会起作用,不要寻找大的解决方案。如果现有端口号的问题将其更改为不同,只要您的应用程序正常运行就没有问题