Node.js应用通过日志库(如Winston、Morgan)或原生console.error
输出的错误信息,是定位数据库连接问题的核心线索。常见错误类型及解读:
Error: connect ECONNREFUSED 127.0.0.1:3306
,说明应用无法访问数据库服务器,可能原因包括数据库服务未启动、主机名/IP错误或端口未开放。Error: ER_ACCESS_DENIED_ERROR: Access denied for user 'user'@'localhost'
,表明用户名、密码错误或用户无本地访问权限。Error: ER_BAD_DB_ERROR: Unknown database 'example_db'
表示指定的数据库未创建。Error: ER_CON_COUNT_ERROR: Too many connections
说明数据库连接数超过最大限制,需优化连接池配置。通过日志中的错误级别(error)、时间戳、错误消息,可快速锁定问题类型。
数据库服务未启动是连接失败的常见原因。在Ubuntu中,使用systemctl
命令检查服务状态:
sudo systemctl status mysql # MySQL服务
sudo systemctl status postgresql # PostgreSQL服务
若服务未运行(状态为inactive
),启动服务:
sudo systemctl start mysql
启动后再次检查状态,确认服务处于active (running)
。
Node.js应用中的数据库配置(如主机名、端口、用户名、密码、数据库名)需与数据库实际设置一致。常见配置位置:
dbConfig
对象(如const dbConfig = { host: 'localhost', user: 'root', password: '123456', database: 'mydb' }
);.env
文件中的DB_HOST
、DB_USER
等)。重点检查:
localhost
或127.0.0.1
,远程数据库用IP或域名;3306
,PostgreSQL默认5432
;若数据库部署在远程服务器,需检查网络连通性和防火墙规则:
ping
命令检查应用服务器是否能访问数据库服务器:ping <数据库服务器IP>
若无法ping通,需检查网络配置(如路由、DNS)。ufw
防火墙时,开放数据库端口(如MySQL的3306
):sudo ufw allow 3306/tcp # 允许TCP协议的3306端口
sudo ufw reload # 重新加载防火墙规则
确认端口开放:sudo ufw status
。确保连接数据库的用户具备相应权限。登录MySQL命令行,执行以下命令:
-- 查看用户权限
SELECT User, Host FROM mysql.user;
-- 授权用户(以root用户为例,允许从localhost访问所有数据库)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'your_password';
FLUSH PRIVILEGES; -- 刷新权限
若用户需从远程主机访问,将localhost
替换为%
(如'root'@'%'
),并确保数据库配置中的host
为远程IP。
若应用使用连接池(如mysql2/promise
的createPool
),需合理配置连接池参数,避免连接超限:
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: '123456',
database: 'mydb',
connectionLimit: 10, // 最大连接数(根据服务器性能调整)
waitForConnections: true, // 连接耗尽时等待而非报错
queueLimit: 0 // 等待队列长度(0表示无限制)
});
常见错误:ER_CON_COUNT_ERROR
(连接数超过connectionLimit
),需增大connectionLimit
或优化应用连接复用。
通过命令行工具直接连接数据库,验证配置是否正确:
mysql -u <用户名> -p -h <主机名> <数据库名>
(如mysql -u root -p -h localhost mydb
);psql -U <用户名> -h <主机名> -d <数据库名>
。通过以上步骤,可系统性地定位Ubuntu环境下Node.js应用与数据库连接的问题。关键是结合日志中的错误信息,逐步排查服务状态、配置参数、网络连通性、权限等环节,最终解决问题。