如何解决当我在 NodeJS 应用程序中运行 nodemon 时,端口 3306 已在使用中
我有一个 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 服务器或在命令提示符下运行此命令(以管理员身份)
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 上的进程
命令 PID 用户 FD 类型设备大小/关闭节点名称
节点 12012 用户 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,});
因此,如您所见,应该存在端口冲突,因为我只有 PORT=3006
文件中的 .env
变量。
解决方案
我所要做的就是将数据库端口指定为
DB_PORT = 3006
APP_PORT = 5000
在环境变量中。
谢谢你和 Goog 好运。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。