Node.js 在NodeJS应用程序中注册nodemon时端口3306已在使用
我有一个nodejs应用程序,在我打开MySQL工作台之前一直运行得很好,在我的项目中还包含了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
.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
文件中只有onport=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