端口 3000 已在使用 [nodemon] 应用程序崩溃 - 在启动之前等待文件更改

Afe*_*een 8 javascript node.js

端口 3000 已在使用中 [nodemon] 应用程序崩溃 - 在启动之前等待文件更改...所以请帮我解决这个问题

Tud*_*tin 24

借用我对这个问题的回答

  1. kill-portnode 包安装为 dev 依赖项:

    npm install kill-port --save-dev
    
    Run Code Online (Sandbox Code Playgroud)
  2. nodemon.json在项目的根目录中创建一个文件,其中包含:

    {
      "events": {
        "restart": "kill-port 3000",
        "crash": "kill-port 3000"
      },
      "delay": "1500"
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 然后,在你的package.json文件中,有这样的东西:

    "scripts": {
        "start-dev": "nodemon app.js",
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 然后在开发模式下启动您的应用程序:

    npm run start-dev
    
    Run Code Online (Sandbox Code Playgroud)


小智 17

杀死一个拥有 3000 端口的进程

类 Unix 操作系统(例如 GNU/Linux、FreeBSD、macOS)

首先,让我们看看如何杀死一个打开了端口的进程。

使用该lsof命令,我们可以检索具有给定端口的 PID:

$ lsof -i :3000 -t
12345
Run Code Online (Sandbox Code Playgroud)

然后我们可以通过执行以下操作来终止这个进程:

$ kill 12345
Run Code Online (Sandbox Code Playgroud)

让我们把它变成一个单行:

lsof -i :3000 -t | xargs kill
Run Code Online (Sandbox Code Playgroud)

如果您使用环境变量来设置服务器端口,我们可以指定它而不是硬编码我们的值:

lsof -i :${PORT} -t | xargs kill
Run Code Online (Sandbox Code Playgroud)

最后,如果未设置环境变量,我们可以默认使用端口 3000:

lsof -i :${PORT:-3000} -t | xargs kill
Run Code Online (Sandbox Code Playgroud)

微软Windows

除非你在运行nodemon的Windows子系统为Linux(WSL) lsof是不是在Windows中可用。但是,netstat在 Windows shell 上可用:

netstat -ano | findstr :3000
Run Code Online (Sandbox Code Playgroud)

这将返回正在使用端口 3000 的进程的 PID,我们可以使用它来使用以下tskill命令终止进程:

tskill 12345
Run Code Online (Sandbox Code Playgroud)

如果您只关心确保拥有该端口的进程在没有任何正常关闭的情况下已死,则可以忽略下面的警告。

关于 Windows 进程终止行为的警告

如果您的应用在SIGTERMnodemon 触发tskill命令时正常侦听关闭,Windows 将在您的应用有机会触发process.on('SIGTERM')事件处理程序之前无条件终止您的进程。

有关此警告的更多详细信息,请访问:

有时 tskill 命令由于某些原因无法运行。从上面的netstat命令中找到PID后也可以使用下面的命令杀掉进程

taskkill /F /T /PID 12345
Run Code Online (Sandbox Code Playgroud)

让 nodemon 执行钩子

Nodemon 允许您通过nodemon.json配置文件设置事件挂钩:

{
  "events": {
    "crash": "sh -c 'lsof -i :${PORT:-3000} -t | xargs kill'"
  }
}
Run Code Online (Sandbox Code Playgroud)

这将导致 nodemonsh -c 'lsof -i :${PORT:-3000} -t | xargs kill在您的应用程序崩溃时执行命令,从而杀死它产生的保持端口打开的子进程。

有关 nodemon 事件的更多信息,请查看他们的文档:


小智 5

解决这个问题的最好方法是使用以下命令直接终止端口。

fuser -n tcp -k 3000
Run Code Online (Sandbox Code Playgroud)


小智 -2

看来3000端口正在被使用。您可以终止使用 3000 端口的进程,也可以将节点的端口从 3000 更改为任何其他端口。