Node.js 日志定位数据库连接问题的实操流程
一、先定位日志中的错误类型
journalctl -u mongod)sudo systemctl status <service> 检查数据库服务是否运行,并配合 sudo journalctl -u <service> -f 实时跟踪日志。二、按错误类型对照排查
| 错误现象或关键词 | 优先检查 | 快速修复 |
|---|---|---|
| ECONNREFUSED / 目标主机主动拒绝 | 数据库是否启动、监听端口是否正确、云安全组/本机防火墙是否放行 | 启动数据库;如在 Ubuntu 用 sudo systemctl start mysql;开放端口(如 sudo ufw allow 3306/tcp);核对应用配置的 host/port |
| ETIMEDOUT / 连接超时 | 网络连通性、端口可达性、数据库负载 | ping/telnet <host> <port> 或 nc -vz <host> <port> 测试;检查安全组/防火墙;必要时优化数据库或网络 |
| ER_ACCESS_DENIED_ERROR / Authentication failed | 用户名、密码、连接来源主机、权限是否匹配 | 在数据库中核对用户与来源主机:SELECT User,Host FROM mysql.user; 必要时执行授权:GRANT ALL PRIVILEGES ON db.* TO 'user'@'host' IDENTIFIED BY 'pwd'; FLUSH PRIVILEGES; |
| ER_NOT_SUPPORTED_AUTH_MODE | MySQL 8.0 默认 caching_sha2_password 与旧驱动不兼容 | 方案A:改用支持该插件的驱动(如 mysql2);方案B:将用户认证方式改为 mysql_native_password:ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'pwd'; FLUSH PRIVILEGES; |
| MongoNetworkError / wire version 不兼容 | MongoDB 与 Node.js 驱动版本不匹配 | 升级 MongoDB 或 Node.js 驱动/Mongoose 至兼容版本(参考官方兼容矩阵) |
| 连接池耗尽、Too many connections | 连接池大小、未释放连接、连接泄漏 | 调整连接池上限(如 connectionLimit)、确保查询后 release()/end()、增加超时与回收策略 |
| SSL/TLS 握手失败 | SSL 配置、证书路径、CA 信任链 | 在连接选项中正确设置 ssl: true、ca/cert/key,或临时关闭 SSL 验证用于排查(仅测试环境) |
三、环境与网络层面的核验
sudo systemctl status mysql,未运行则 sudo systemctl start mysqlsudo systemctl status mongod,未运行则 sudo systemctl start mongodbind-address,需要远程访问时设为 0.0.0.0 并重启服务sudo ufw allow <port>/tcp(如 3306 或 27017)ping <db_host>、telnet <db_host> <port> 或 nc -vz <db_host> <port> 验证端口可达性四、代码与配置层面的检查
connectionLimit、acquireTimeoutMillis、idleTimeoutMillisapp.use((err, req, res, next) => { console.error(err.stack); res.status(500).send('Something broke!'); })五、5 分钟应急清单
sudo systemctl status mysql(或 mongod),必要时 sudo systemctl restart mysql。sudo ufw allow 3306/tcp(或 27017),并检查云安全组。mysql -h <host> -P <port> -u <user> -p 或 mongo --host <host> --port <port>。