当我在 NodeJS 应用程序中运行 nodemon 时端口 3306 已经在使用中

PORT 3306 Already In use when i rn nodemon in NodeJS app

我有一个 nodejs 应用程序,在我打开 MySQL Workbench 并且还在我的项目中包含 .env 文件之前,它一直都很好 运行ning。当我打开 MySQL Workbench 以可视化过程而不使用 mysql shell 时,我正在将系统部署到 Digital Ocean 管理的数据库服务。一切正常,我将数据库迁移到 DO 数据库集群。

我也想让我的应用程序更安全,所以我碰到了 .env 文件方法并尽力跟进,我想出了这个:

第 1 步:

npm i dotenv --save

第 2 步:将 require('dotenv').config() 添加到我的 server.js 文件

第 3 步:更新我的数据库连接文件

    const mysql = require("mysql");
const conn = mysql.createConnection({
  host: process.env.HOST,
  user: process.env.USERNAME,
  password: process.env.PASSWORD,
  //rsport     : (process.env.PORT),
  database: process.env.DATABASE_NAME,
  multipleStatements: true,
});

conn.connect((err) => {
  if (err) {
    console.log("Oops!, Failed to connect to the database.");
  } else {
    console.log("Database connection succesfull!");
  }
});

module.exports = conn;

第 4 步:我相应地设置本地 .env 文件和远程 .env 文件

第5步:我运行nodemon它return出现如下错误:

body-parser deprecated undefined extended: provide extended option server.js:27:17
events.js:292
      throw er; // Unhandled 'error' event
      ^

Error: listen EADDRINUSE: address already in use :::3306
    at Server.setupListenHandle [as _listen2] (net.js:1318:16)
    at listenInCluster (net.js:1366:12)
    at Server.listen (net.js:1452:7)
    at Function.listen (G:\Maxiko Payment System\Systems\Management Apps\Microservices\mx-core\node_modules\express\lib\application.js:618:24)
    at Object.<anonymous> (G:\Maxiko Payment System\Systems\Management Apps\Microservices\mx-core\server.js:47:5)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
Emitted 'error' event on Server instance at:
    at emitErrorNT (net.js:1345:8)
    at processTicksAndRejections (internal/process/task_queues.js:80:21) {
  code: 'EADDRINUSE',
  errno: -4091,
  syscall: 'listen',
  address: '::',
  port: 3306
}
[nodemon] app crashed - waiting for file changes before starting...

我做错了什么?老实说,我不认为 .env 与此有任何关系,但我肯定知道 MySQL Workbench 建立了自己的联系。那么我是否相信一次只有一个应用程序可以连接到数据库?这对我来说也不对。

尝试运行将您的节点 js 服务器连接到不同的端口或 运行 在命令提示符下执行此命令(以管理员身份)

netstat -ano | findstr :<PORT>

替换为您正在使用的端口号(在您的情况下为 3306)

然后它会显示你进程的PID 像这样

TCP 0.0.0.0:3306 0.0.0.0:0 LISTEN 77777

77777 是 PID

然后运行这个命令

taskkill /PID <PID> /F

替换为你在上一个命令中得到的PID

它看起来像一些其他进程已经 运行在您的 3306 端口上
您可以使用以下命令检查它

lsof -i tcp:3306

它将列出您已经在端口 3306 上的进程

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 12012 user 20u IPv6 86535 0t0 TCP *:3306 (LISTEN)

这表明 PID 为 12012 的进程已经在使用您的端口 3306
如果这个进程是多余的,你可以通过以下命令杀死它:

sudo kill -9 PID

用您的进程 ID 替换 PID,在我的例子中是 12012
否则你可以使用其他端口 运行 你的节点服务器

我找到问题了。确实有另一个进程 运行 并使用相同的端口。在应用服务器初始化脚本中,我是这样设置端口的:

app.use('port', process.env.PORT || 5000)

在 fdatabase 连接文件中,我也将端口设置为


const conn = mysql.createConnection({
  host: process.env.DB_HOST,
  user: process.env.DB_USER,
  password: process.env.DB_PASS,
  port     : (process.env.DB_PORT),
  database: process.env.DB_NAME,
  multipleStatements: true,
});

因此,如您所见,应该存在端口冲突,因为我在 .env 文件中只有 PORT=3006 变量。

解决方案

我所要做的就是将数据库端口指定为

DB_PORT = 3006
APP_PORT = 5000

在环境变量中。

谢谢你,祝你好运。