Node.js使用Sequelize连接AWS RDS MariaDB失败求助
本地环境使用Sequelize连接MariaDB完全正常,但切换到AWS RDS托管的MariaDB时连接失败。已通过MySQL Workbench验证RDS实例的连接可用性,但Node.js项目抛出以下超时错误:
Unable to connect to the database: SequelizeConnectionError: (conn=1690, no: 45012, SQLState: 08S01) Connection timeout: failed to create socket after 1001ms
项目代码实现:
const dbConfig = require('../config/dbConfig'); const { Sequelize, DataTypes } = require('sequelize'); const sequelize = new Sequelize(dbConfig.DB, dbConfig.USER, dbConfig.PASSWORD, { host: dbConfig.HOST, port: dbConfig.PORT, dialect: "mariadb", operatorsAliases: 0, define: { freezeTableName: true // 默认会自动修改表名,用此参数限制该行为 }, pool: { max: 5, min: 0, acquire: 30000, idle: 10000 } }); sequelize.authenticate() .then(() => { console.log('DB Connected...'); }) .catch((error) => { console.error(`Unable to connect to the database: ${error}`); })
排查与解决方案
检查RDS安全组配置:确认RDS实例的安全组入站规则,允许Node.js服务所在的IP(或VPC)访问3306端口(MariaDB默认端口)。注意Workbench使用的是你本地IP,而Node.js服务可能是EC2公网IP、本地动态IP等,需确保这些IP都在安全组白名单内。
延长连接超时参数:当前代码的连接池超时是针对获取连接的等待时间,需添加方言专属的连接超时配置,延长创建socket的等待时长:
const sequelize = new Sequelize(dbConfig.DB, dbConfig.USER, dbConfig.PASSWORD, { // 原有配置保留 dialectOptions: { connectTimeout: 10000 // 延长至10秒 } });
校验dbConfig配置准确性:核对
dbConfig.HOST是否为RDS实例的完整端点(如xxx.rds.amazonaws.com),PORT是否与RDS设置的端口一致,账号密码是否和Workbench使用的完全匹配,避免配置中存在多余空格或特殊字符。排查网络环境:若Node.js服务在VPC内,确认是否与RDS实例同属一个VPC,或已配置VPC对等连接、NAT网关等网络打通方案;若为本地开发,检查防火墙、代理是否阻止了3306端口的出站请求。
调整MariaDB驱动版本:Sequelize的mariadb方言依赖
mariadb驱动,部分版本可能存在兼容性问题,尝试升级或降级到稳定版本:
npm uninstall mariadb npm install mariadb@3.2.0
内容的提问来源于stack exchange,提问作者Durvash Nimje

