必须用mysql2而非mysql模块,因mysql 8.0.4+默认caching_sha2_password认证插件不被旧mysql模块支持,导致er_not_supported_auth_mode错误或连接卡死;mysql2原生支持该插件,且提供promise api、连接池、性能提升等优势。

直接用 mysql2,别用老的 mysql 模块——MySQL 8.0.4+ 默认身份验证方式不兼容,连不上就是它的问题。
为什么必须选 mysql2 而不是 mysql
MySQL 8.0.4 开始默认启用 caching_sha2_password 认证插件,而原生 mysql 模块只支持旧的 mysql_native_password。现象是:连接时抛出 ER_NOT_SUPPORTED_AUTH_MODE 错误,或卡在 connect() 不返回也不报错。
-
mysql2内置支持caching_sha2_password,无需降级服务端配置 - 它还提供 Promise API(
promise()包装器)、流式结果、批量插入等实用能力 - 性能比
mysql高约 15–20%,尤其在处理大量小查询时
mysql2 连接池配置的关键参数
单连接对象(createConnection)只适合测试或极低并发场景;生产环境必须用连接池(createPool),否则会快速耗尽系统文件描述符。
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
-
connectionLimit:默认 10,建议设为 10–20(根据服务器 CPU 核心数和预期 QPS 调整) -
waitForConnections:设为true(默认),避免请求直接失败;配合queueLimit控制排队上限 -
acquireTimeout:毫秒级,建议 10000(10 秒),防止慢查询拖垮整个池 -
idleTimeoutMillis:设为 60000(60 秒),及时释放空闲连接,避免 MySQL 端因wait_timeout主动断开引发错误 - 不要设
ssl: true除非你真有证书——没配好会导致连接 hang 住
如何安全传入密码而不硬编码
把密码写死在代码里或 .js 配置文件中,等于把数据库钥匙贴在源码仓库门上。
- 用
process.env.DB_PASSWORD读取环境变量,启动时通过DB_PASSWORD=xxx node app.js注入 - 配合
dotenv加载.env文件(仅限开发),但确保.env在.gitignore中 - 禁止在配置对象里拼接字符串:
password: 'root' + process.env.SUFFIX—— 这种写法无法被 dotenv 工具识别,且容易引入空格或换行 - 如果使用 Docker,优先通过
secrets或environment字段注入,而非挂载.env文件
连接后立即验证可用性,别等 query 时报错
调用 pool.getConnection() 并执行 PING 是最轻量的健康检查方式;只靠 pool.on('error') 监听不够——很多错误(如网络中断、认证失败)不会触发该事件,而是静默失败。
- 在应用启动时加一段校验逻辑,失败直接
process.exit(1) - 避免用
SELECT 1——它依赖数据库权限,而PING协议层更底层、权限要求更低 - 示例:
pool.getConnection((err, conn) => { if (err) throw err; conn.ping(err => { if (err) console.error('MySQL ping failed:', err); conn.release(); }); });
字符集、时区、超时这些参数看着琐碎,但漏掉任意一个,在特定数据或部署环境下都可能变成深夜告警的源头。










