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

Node.js Express中MySQL重连触发ER_ACCESS_DENIED_ERROR错误的解决方案咨询

解决MySQL连接重连时的ER_ACCESS_DENIED_ERROR问题

你遇到的循环权限错误,核心问题是重连逻辑没有正确复用数据库连接配置,导致重连时使用了空的用户名和密码。让我一步步帮你修正:

问题根源

你原来的重连代码里写了:

db = mysql.createConnection(db.db);

这里的db.db是完全不存在的——mysql.createConnection()返回的连接对象里并没有db这个属性,等于你传给createConnection一个undefined,它会默认用空用户名、localhost地址、无密码去连接,自然就触发了Access denied for user ''@'localhost'的错误。

修正后的完整代码

我们先把数据库配置单独抽成变量,同时优化重连逻辑(比如判断错误类型、添加重试延迟):

var express = require('express');
const mysql = require("mysql");

// 1. 把数据库配置单独抽成变量,方便重连时复用
const dbConfig = {
  host: 'ipaddress',
  user: 'username',
  password: 'password',
  database: 'my77admin'
};

// 2. 创建初始连接
var db = mysql.createConnection(dbConfig);

// 3. 改进后的重连处理函数
function handleDisconnect() {
  db.connect(function (err) {
    if (err) {
      console.log('连接失败,5秒后重试:', err.stack);
      // 延迟重试,避免频繁请求数据库
      setTimeout(handleDisconnect, 5000);
      return;
    }
    console.log("数据库连接成功!");
  });

  db.on('error', function (err) {
    console.log('数据库连接出错:', err.stack);
    // 只在连接丢失类错误时重连,避免无效循环
    if (err.code === 'PROTOCOL_CONNECTION_LOST' || err.code === 'ECONNRESET') {
      console.log('连接丢失,尝试重连...');
      // 销毁旧连接,重新创建新连接
      db.destroy();
      db = mysql.createConnection(dbConfig);
      handleDisconnect();
    } else {
      // 其他错误(比如权限错误)直接抛出,避免无限循环
      throw err;
    }
  });
}

// 启动重连处理
handleDisconnect();

module.exports = db;

关键改进点

  • 抽离配置变量:把连接配置单独存为dbConfig,确保每次重连都用正确的账号密码。
  • 错误类型过滤:只在连接丢失(PROTOCOL_CONNECTION_LOST)或连接被重置(ECONNRESET)时触发重连,像权限错误这类配置问题直接抛出,避免无效循环。
  • 添加重试延迟:重连失败时延迟5秒再尝试,避免短时间内大量请求给数据库造成压力。
  • 简化逻辑:去掉冗余的参数传递,直接复用全局的db变量和dbConfig,代码更清晰。

额外建议

  • 如果你用的是较新版本的Node.js,推荐改用mysql2模块,它自带连接池功能,能更优雅地处理连接断开和重连,比手动写重连逻辑更可靠。
  • 检查数据库服务器的wait_timeout和interactive_timeout配置,避免服务器主动断开空闲连接过于频繁。

内容的提问来源于stack exchange,提问作者Hong Ernest

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:52:08