Node.js无法认证连接MySQL 8.0,求兼容caching_sha2_password的方案
搞定MySQL 8.0和Node.js的认证兼容问题(保留caching_sha2_password)
嘿,我刚好碰到过一模一样的问题!你的判断完全没错——MySQL 8.0把root用户的默认认证插件改成了caching_sha2_password,但咱们常用的那个mysql npm包(就是mysqljs/mysql)至今还不支持这个新的认证方式,哪怕你更到最新版也没用。不过不用等包更新,有两个办法能让你继续用这个新哈希方式连接:
方法一:换个支持caching_sha2_password的客户端包
最省心的就是换成mysql2或者官方的@mysql/xdevapi,这俩都完美支持新认证。我自己用的是mysql2,因为它和旧mysql包的API几乎完全一致,改代码成本极低:
- 先安装包:
npm install mysql2
- 连接代码只需要改一行引入:
const mysql = require('mysql2'); // 就改这一行! const dbConn = mysql.createConnection({ host: 'localhost', port: 3306, user: 'root', password: 'myRootPassword', database: 'decldb' }); dbConn.connect(err => { if (err) throw err; console.log('Connected!'); });
启动试试,绝对能连上。
方法二:给旧mysql包加SSL配置(不用换包)
如果你不想换包,也可以通过开启SSL连接来适配——因为caching_sha2_password在SSL环境下的认证流程和旧插件兼容。MySQL 8.0默认是开SSL的,你只需要在连接配置里加上SSL相关设置就行:
const mysql = require('mysql'); const dbConn = mysql.createConnection({ host: 'localhost', port: 3306, user: 'root', password: 'myRootPassword', database: 'decldb', ssl: { rejectUnauthorized: false // 本地测试环境可以这么设,生产环境记得配合法证书 } }); dbConn.connect(err => { if (err) throw err; console.log('Connected!'); });
这样旧包也能正常认证了。
为啥更新npm包没用?
因为那个mysql包的维护团队目前没打算支持caching_sha2_password,所以更新到最新版也解决不了问题,上面两个方法是目前最靠谱的解决方案。
内容的提问来源于stack exchange,提问作者Hey
相关产品推荐
相关产品推荐

