如何使用Express连接Node.js与MySQL 8.0?遇认证协议错误求助
解决Express连接MySQL 8.0时的ER_NOT_SUPPORTED_AUTH_MODE错误
这个问题我之前也碰到过!原因很明确——MySQL 8.0默认启用了caching_sha2_password这种新的认证协议,但你用的旧版mysql npm包压根不支持它,所以才会抛出这个ER_NOT_SUPPORTED_AUTH_MODE错误。给你两个靠谱的解决办法,选哪个看你的需求:
方法1:修改MySQL用户的认证方式(不用换npm包)
如果不想换依赖包,直接调整MySQL的用户认证规则就行:
- 打开MySQL命令行,用root用户登录:
mysql -u root -p - 执行下面的SQL语句,把你的连接用户(这里是root)的认证方式改成旧的
mysql_native_password,记得替换成你自己的密码:
要是你用的不是root用户,就把ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'rootpass'; FLUSH PRIVILEGES;'root'@'localhost'换成你实际的用户名和主机地址。 - 重启MySQL服务,再跑你的Express项目,应该就能正常连接了。
方法2:换成支持新认证的mysql2库
如果想保留MySQL 8.0的默认认证方式,推荐换用mysql2这个npm包,它原生支持caching_sha2_password:
- 先卸载旧的
mysql包:npm uninstall mysql - 安装
mysql2:npm install mysql2 - 改一下你的代码,把导入的包换成
mysql2就行,其他逻辑不用动:var express = require('express'); var router = express.Router(); // 把mysql换成mysql2 var mysql = require('mysql2'); router.get('/', function(req, res, next) { var connection = mysql.createConnection({ host : 'localhost', user : 'root', password : 'rootpass' }); connection.connect(function(err) { if (err) throw err; console.log('Connected!'); }); }); - 重新启动项目,连接问题就解决了。
另外提个小建议:你现在的代码只创建了连接但没关闭,最好在完成数据库操作后调用connection.end()来释放连接,避免资源浪费哦。
内容的提问来源于stack exchange,提问作者Diego Izquierdo Dussan
相关产品推荐
相关产品推荐

