Debian 上 Node.js 数据库连接问题的排查与修复
一 快速定位流程
二 常见错误与对应修复
| 错误现象或关键词 | 典型根因 | 修复要点 |
|---|---|---|
| ETIMEDOUT | 网络不通、数据库响应慢、超时阈值过低 | 检查网络与路由;适当增大客户端 connectTimeout/acquireTimeout(如 10000 ms);优化慢查询与索引;必要时提升数据库性能或超时阈值。 |
| ECONNREFUSED | 目标主机未监听端口、服务未启动、端口/地址错误、防火墙阻断 | 确认数据库已启动并监听正确端口;核对 host/port;开放防火墙端口(如 3306);远程访问时确保监听 0.0.0.0 而非仅 127.0.0.1。 |
| ER_ACCESS_DENIED_ERROR / Access denied | 用户名/密码错误、权限不足、主机限制、认证插件不匹配 | 校验凭据;检查用户 host 白名单(如 ‘user’@‘%’ 或指定网段);必要时调整 MySQL 8.0 的认证插件(如 caching_sha2_password 兼容设置);执行 SHOW GRANTS 并 FLUSH PRIVILEGES。 |
| ER_NOT_SUPPORTED_AUTH_MODE | MySQL 8 默认认证插件与驱动不匹配 | 为用户设置兼容插件(如 mysql_native_password),或升级驱动/客户端以支持 caching_sha2_password。 |
| Cannot enqueue Handshake after invoking quit | 应用侧连接未正确释放、重复关闭、连接池误用 | 规范连接生命周期:获取连接后 release/end;在异常分支也确保释放;避免对已关闭的连接操作。 |
| 连接池耗尽/Too many connections | 并发过高、池上限过小、连接泄漏 | 调整 connectionLimit/max;确保每次使用后释放;监控并回收泄漏连接;必要时扩容数据库或限流。 |
三 配置与代码检查清单
四 最小可用示例 MySQL 连接
// db.js
const mysql = require('mysql2/promise');
const pool = mysql.createPool({
host: process.env.DB_HOST || '127.0.0.1',
port: process.env.DB_PORT || 3306,
user: process.env.DB_USER,
password: process.env.DB_PASS,
database: process.env.DB_NAME,
ssl: process.env.DB_SSL === 'true', // 生产建议开启
connectionLimit: 10,
connectTimeout: 10000,
acquireTimeout: 10000,
timeout: 30000
});
async function test() {
let conn;
try {
conn = await pool.getConnection();
const [rows] = await conn.execute('SELECT 1 AS ok');
console.log('DB OK:', rows[0].ok);
} catch (err) {
console.error('DB ERROR:', err);
throw err;
} finally {
if (conn) conn.release();
}
}
module.exports = { pool, test };
五 需要你提供的关键信息