使用Node.js连接MySQL时遇ER_NOT_SUPPORTED_AUTH_MODE错误求助
解决Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server问题
嘿,这个问题我太熟了!本质原因是MySQL 8.0及以上版本默认启用了caching_sha2_password认证插件,而你正在使用的旧版mysql Node.js模块并不支持这种新的认证协议,所以才会抛出这个错误。
给你两种最常用的解决办法,选一种适合你的就行:
方法一:修改MySQL用户的认证方式为旧版兼容模式
这种方法不需要改代码,直接调整MySQL的用户配置:
- 首先登录MySQL命令行工具:
mysql -u root -p - 输入密码进入后,执行以下SQL修改用户的认证插件(把
root、localhost和'pass'替换成你实际的用户名、主机和密码):ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pass'; - 最后刷新权限让配置生效:
FLUSH PRIVILEGES;
退出MySQL后,再重新运行你的Node.js代码,应该就能正常连接数据库了。
方法二:改用支持新认证的Node.js数据库库
如果你不想改动MySQL的配置,可以换成mysql2包,它原生支持caching_sha2_password认证:
- 先卸载旧的
mysql包:npm uninstall mysql - 安装
mysql2:npm install mysql2 - 修改你的代码,只需要把引入模块的地方改成
mysql2就行,其余代码完全不用动:var mysql = require('mysql2'); var connection = mysql.createConnection({ host : 'localhost', user : 'root', password : 'pass', database : 'my_db', insecureAuth : true }); connection.connect(); connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) { if (error) throw error; console.log('The solution is: ', results[0].solution); }); connection.end();
运行修改后的代码,问题就能解决啦。
另外提一句:你代码里的insecureAuth: true是针对旧版认证的兼容配置,用方法一的话可以保留;用方法二的话这个配置其实可以删掉,不过留着也不会有问题。
内容的提问来源于stack exchange,提问作者Manoj
相关产品推荐
相关产品推荐

