Node.js 在NodeJS应用程序中注册nodemon时端口3306已在使用

Node.js 在NodeJS应用程序中注册nodemon时端口3306已在使用,node.js,mysql-workbench,digital-ocean,Node.js,Mysql Workbench,Digital Ocean,我有一个nodejs应用程序,在我打开MySQL工作台之前一直运行得很好,在我的项目中还包含了.env文件。我正在将系统部署到Digital Ocean managed database service的过程中,当时我打开了MySQL Workbench以可视化该过程,而不是使用MySQL外壳。一切正常,我将数据库迁移到DO数据库集群 我还想让我的应用程序更安全,所以我偶然遇到了.env文件方法,并尽我最大的努力做到这一点,我想到了以下几点: 步骤1: npm i dotenv --save

我有一个nodejs应用程序,在我打开MySQL工作台之前一直运行得很好,在我的项目中还包含了
.env
文件。我正在将系统部署到Digital Ocean managed database service的过程中,当时我打开了MySQL Workbench以可视化该过程,而不是使用MySQL外壳。一切正常,我将数据库迁移到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
it返回以下错误:

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

body解析器已弃用未定义的扩展:提供扩展选项server.js:27:17
events.js:292
投掷者;//未处理的“错误”事件
^
错误:侦听EADDRINUSE:地址已在使用中:::3306
在Server.setupListenHandle[as _listen2](net.js:1318:16)
在ListeniCluster(net.js:1366:12)
在Server.listen(net.js:1452:7)
在Function.listen(G:\Maxiko Payment System\Systems\Management Apps\Microservices\mx core\node\u modules\express\lib\application.js:618:24)
反对。(G:\Maxiko支付系统\Systems\Management Apps\Microservices\mx core\server.js:47:5)
at模块编译(内部/modules/cjs/loader.js:1063:30)
在Object.Module._extensions..js(internal/modules/cjs/loader.js:1092:10)
在Module.load(内部/modules/cjs/loader.js:928:32)
at Function.Module._load(内部/modules/cjs/loader.js:769:14)
在Function.executeUserEntryPoint[作为runMain](internal/modules/run_main.js:72:12)
在以下位置的服务器实例上发出了“错误”事件:
在emitErrorNT(net.js:1345:8)
在处理和拒绝时(内部/process/task_queues.js:80:21){
代码:'EADDRINUSE',
错误号:-4091,
syscall:'listen',
地址:':',
港口:3306
}
[nodemon]应用程序崩溃-正在等待文件更改,然后再启动。。。

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

尝试在其他端口上运行node js服务器,或者在命令提示符下运行此命令(作为管理员)

77777是PID

然后运行这个命令

taskkill /PID <PID> /F
taskkill/PID/F

替换为上一个命令中得到的PID,它看起来就像端口3306上已经运行的其他进程一样
您可以使用下面的命令进行检查

lsof-i tcp:3306

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

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

这显示一个PID为12012的进程已经在使用您的端口3306
如果此进程是冗余的,您可以通过以下命令终止它:

sudo kill-9 PID

用进程id替换PID,在我的例子中,进程id是12012

否则,您可以使用其他端口运行节点服务器

我发现了问题。确实有另一个进程正在运行并使用同一端口。在app server初始化脚本中,我将端口设置为:

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
文件中只有on
port=3006
变量

解决方案

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

DB_PORT = 3006
APP_PORT = 5000
在环境变量中

谢谢你,祝你好运


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,
});

DB_PORT = 3006
APP_PORT = 5000