【问题标题】:PORT 3306 Already In use when i rn nodemon in NodeJS app当我在 NodeJS 应用程序中运行 nodemon 时,端口 3306 已在使用中
【发布时间】:2021-04-24 10:47:18
【问题描述】:

我有一个 nodejs 应用程序一直运行良好,直到我打开 MySQL Workbench 并且还在我的项目中包含 .env 文件。我正在将系统部署到 Digital Ocean 托管数据库服务时,我打开 MySQL Workbench 以可视化该过程而不使用 mysql shell。一切正常,我将我的数据库迁移到 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 它返回以下错误:

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 建立了自己的连接。那么我是否相信一次只有一个应用程序可以连接到数据库?这对我来说也不对。

【问题讨论】:

    标签: node.js mysql-workbench digital-ocean


    【解决方案1】:

    尝试在不同的端口上运行您的节点 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 替换

    【讨论】:

      【解决方案2】:

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

      lsof -i tcp:3306

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

      命令 PID 用户 FD 类型 设备大小/关闭节点名称
      节点 12012 用户 20u IPv6 86535 0t0 TCP *:3306 (LISTEN)

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

      sudo kill -9 PID

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

      【讨论】:

        【解决方案3】:

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

        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
        

        在环境变量中。

        谢谢你,Goog 好运。

        【讨论】:

          猜你喜欢
          • 2020-02-19
          • 2020-12-31
          • 2014-06-08
          • 2020-01-26
          • 1970-01-01
          • 2016-07-15
          • 2019-06-23
          • 1970-01-01
          • 2021-09-29
          相关资源
          最近更新 更多