You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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改为对应的地址。
  • 排查防火墙/安全软件拦截
    本地防火墙或杀毒软件可能拦截了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 22:47:51