JavaScript连接MySQL出现ECONNREFUSED错误,求解决方案
Node.js连接MySQL时遭遇ECONNREFUSED错误(errno: -111)
连接MySQL数据库时出现如下错误:
{ errno: -111, code: 'ECONNREFUSED', syscall: 'connect',
address: '127.0.0.1', port: 3306, fatal: true }
我使用的主机、用户名和密码与能正常连接的PopSQL完全一致,以下是我的Node.js代码:
const databasePassword = process.env.DATABASE_PASSWORD const mysql = require('mysql'); function saveIDInformation(titleID){ let savingStatus = "passed" const con = mysql.createConnection({ host: "localhost", user: "root", password: databasePassword, database: "idmarketplace", }); con.connect(function(err) { if (err) throw err; console.log("Connected!"); const IDinformation = `INSERT INTO idInformation(titleID) VALUES(${titleID});`; con.query( IDinformation,(err, result)=> { if (err) { savingStatus = "query error"; throw err; } console.log("Data inserted"); }); }); return{ status: savingStatus } } exports.saveIDInformation = saveIDInformation;
我已经在GitHub、Stack Overflow、ChatGPT等平台以及YouTube上查找过解决方案,但都没有效果,希望能解决这个连接问题。
解决方案
确认MySQL服务状态
先检查本地MySQL服务是否正在运行:- Windows:打开服务管理器,找到MySQL服务,确认状态为"正在运行",未启动则右键启动。
- Linux:执行
systemctl status mysql查看状态,未运行则用systemctl start mysql启动。 - Mac(brew安装):执行
brew services list查看,未运行则用brew services start mysql启动。
验证MySQL监听配置
确认MySQL是否监听127.0.0.1:3306:- Linux/Mac:执行
netstat -an | grep 3306,查看输出是否包含127.0.0.1:3306或::1:3306。 - Windows:执行
netstat -ano | findstr :3306,确认监听地址是否为127.0.0.1。
如果MySQL绑定了其他地址(比如0.0.0.0),尝试将连接配置的host改为对应的地址。
- Linux/Mac:执行
排查防火墙/安全软件拦截
本地防火墙或杀毒软件可能拦截了Node.js访问3306端口,临时关闭防火墙测试连接是否正常,若正常则给Node.js添加允许访问3306端口的规则。确认环境变量加载正确性
在代码开头添加console.log(databasePassword),打印环境变量获取到的密码,确认是否与PopSQL使用的一致,避免环境变量未正确加载的问题。代码优化(附带SQL注入防护)
当前代码用字符串拼接SQL语句存在严重的SQL注入风险,建议改用参数化查询:const IDinformation = 'INSERT INTO idInformation(titleID) VALUES(?);'; con.query(IDinformation, [titleID], (err, result) => { if (err) { savingStatus = "query error"; throw err; } console.log("Data inserted"); });另外,原代码中
savingStatus的返回存在异步问题,函数会先返回初始值"passed",而数据库操作是异步执行的,建议用Promise封装函数,确保状态正确返回:const databasePassword = process.env.DATABASE_PASSWORD const mysql = require('mysql'); function saveIDInformation(titleID) { return new Promise((resolve, reject) => { const con = mysql.createConnection({ host: "localhost", user: "root", password: databasePassword, database: "idmarketplace", }); con.connect(function(err) { if (err) { reject({ status: "connection error" }); return; } console.log("Connected!"); const IDinformation = 'INSERT INTO idInformation(titleID) VALUES(?);'; con.query(IDinformation, [titleID], (err, result) => { con.end(); // 操作完成后关闭连接 if (err) { reject({ status: "query error" }); return; } console.log("Data inserted"); resolve({ status: "passed" }); }); }); }); } exports.saveIDInformation = saveIDInformation;
内容的提问来源于stack exchange,提问作者Elmond Pattanan
相关产品推荐
相关产品推荐

