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

时间:2020-04-13 03:53:17

标签: javascript node.js express nodemon

我正在创建一个项目,并使用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 )

20 个答案:

答案 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'); 
  }
);

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

答案 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

之前: enter image description here

这是我所做的:

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

之后: enter image description here

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

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

  1. 如果您同时拥有server.jsserver1.js这两个文件,并且它们具有相同的端口号(8000),则当npm run server时,会发生错误。
  2. 默认情况下,nodemon似乎将自动运行server.js。即使我的package.json中只有"server": "npx nodemon server1.js",但是当我的终端执行npm run server命令时,nodemon会同时运行server.jsserver1.js
  3. 由于server.jsserver1.js具有相同的端口号,因此会发生错误。
  4. 以类似的方式,如果我们只有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

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

答案 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

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

答案 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...

enter image description here

答案 18 :(得分:0)

我如何解决它,因为我没有在该端口上运行任何东西,但它仍然给我错误。要清除的杀死节点是具有以下内容的缓存:

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

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

答案 19 :(得分:-3)

我的解决方案很简单

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

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