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

求助:通过Express.js(Node.js)结合cPanel连接MySQL数据库失败

MySQL连接失败排查方案

针对你的Express应用连接MySQL失败的问题,按以下步骤逐一排查:

1. 验证MySQL服务器的网络可访问性

  • 先测试目标IP的3306端口是否开放:
    在你的服务器上执行命令:
    telnet 103.200.23.139 3306
    # 或者用nc
    nc -zv 103.200.23.139 3306
    
    如果连接超时/被拒绝,说明:
    • 服务器的防火墙/安全组未放行3306端口
    • MySQL服务未绑定公网IP(检查my.cnf里的bind-address,需设为0.0.0.0或允许你的客户端IP)
    • MySQL服务未启动

2. 检查数据库用户权限

登录MySQL服务器,执行以下SQL,确认admin用户允许从你的应用服务器IP访问:

SELECT host, user FROM mysql.user WHERE user = 'admin';

如果host列是localhost或特定IP而非%(允许所有IP),则需要授权:

GRANT ALL PRIVILEGES ON test.* TO 'admin'@'%' IDENTIFIED BY '33s72cpsZYXmAGL';
FLUSH PRIVILEGES;

3. 修复代码中的问题

你的代码存在几个关键错误,会导致连接失败或服务异常:

  • 未指定监听端口:app.listen()必须指定端口,比如你的服务器对应端口(如3000):
    app.listen(3000, () => {
      console.log('服务已启动');
    });
    
  • 未主动建立连接:调用query前需要先执行connect,并处理连接错误:
    connection.connect(function(err) {
      if (err) {
        console.error('数据库连接失败: ' + err.stack);
        return;
      }
      console.log('已连接到数据库,连接ID: ' + connection.threadId);
    });
    
  • 错误处理不当:路由中直接throw error会导致服务崩溃,应返回错误响应:
    app.get('/test_database', (req, res) => {
      connection.query(`select * from test_table`, function (error, results, fields) {
          if (error) {
            return res.status(500).send('数据库查询失败: ' + error.message);
          }
          res.send(results);
      });  
    });
    
  • 冗余的res.end():res.send()已经自动结束响应,无需额外调用res.end()

4. 确认依赖包正确安装

确保已安装mysql包:

npm install mysql

如果使用Node.js新版本,推荐使用mysql2包(兼容性更好),安装后替换依赖即可:

const mysql = require('mysql2');

内容的提问来源于stack exchange,提问作者heeyoung abc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 20:32:41