Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
解决方案来自stackoverflow
[推荐] 将“mysql.js”替换为“mysql2.js”包
npm un mysql && npm i mysql2
请注意,这mysql2
是流行的分叉作品mysql
,但它的受欢迎程度(2020 年 4 月每周 62 万次下载mysql2
)已经接近原始包(2021mysql
年 4 月每周 72 万次下载),因此进行切换似乎是合理的!
[不推荐] 降级“MySQL”以使用旧的“mysql_native_password”进行身份验证
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password ...
概括
- 如果您只是想消除错误,以冒项目安全风险为代价(例如,这只是个人项目或开发环境),请使用@Pras 的答案——
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'
然后flush privileges
- 如果您想对其进行修复,但不知道为什么,只需安装和使用
mysql2
(而不是mysql
)并使用它 --npm i mysql2
和mysql = require('mysql2');
. - 如果您是一位总是渴望学习的好奇开发人员,请继续阅读……:
这是怎么回事?
我们先搞清楚这是怎么回事。
MySQL 8 支持可插入的身份验证方法。默认情况下,使用其中一个 namedcaching_sha2_password
而不是我们的好旧mysql_native_password
(source)。很明显,使用经过多次握手的加密算法比已经存在24 年的普通密码传递更安全!
现在,问题出mysqljs
在 Node(你安装并在你的 Node 代码中使用它的包npm i mysql
)还不支持 MySQL 8 的这种新的默认身份验证方法。问题在这里: https: //github.com/mysqljs/mysql/issues/1507并且在 3 年后(截至 2019 年 7 月)仍然开放。
2019 年 6 月更新:现在mysqljs 中有一个新的 PR来解决这个问题!
2020 年 2 月更新:显然它计划在 mysqljs 的第 3 版中发布。
2020年 7 月更新:显然它还没有(至少到 2020 年 4 月),但它声称node-mysql2正在支持身份验证切换请求。请在下面评论是否node-mysql2可以很好地解决这个问题——我稍后会自己测试。
2021 年 4 月更新:问题似乎仍然存在,就在 3 天前,有人创建了一个分支并将它放在那里——但还没有正式出现在 mysql.js 包中。此外,根据下面的评论,似乎mysql2 包工作正常并正确支持身份验证开关。
您当前的选择
选项 1) [不推荐] 降级“MySQL”以使用旧的“mysql_native_password”进行身份验证
这就是每个人在这里的建议(例如上面的最佳答案)。您只需进入mysql
并运行一个查询,说root
可以使用旧mysql_native_password
方法进行身份验证:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password ...
好消息是,生活将变得简单,您仍然可以毫无问题地使用像 Sequel Pro 这样的好旧工具。但问题是,您没有利用可用的更安全(也很酷,请阅读下文)的东西。
选项 2) [Meh...] 用 MySQL Connecter X DevAPI 替换“节点”包
MySQL X DevAPI for Node是Node 的 Mysqljs 包的替代品,由http://dev.mysql.com官方人员提供。
它就像一个支持身份验证的魅力caching_sha2_password
。(只要确保您使用端口33060
进行X 协议通信即可。)
糟糕的是,您已经离开了我们mysql
每个人都习惯并依赖的旧包。
好消息是,您的应用程序现在更安全了,您可以利用我们的老朋友没有提供的大量新功能!只需查看X DevAPI 的教程,您就会发现它有大量可以派上用场的新特性。您只需要支付学习曲线的代价,这预计会伴随任何技术升级而来。:)
附言。不幸的是,这个 XDevAPI 包还没有类型定义(TypeScript 可以理解),所以如果你在typescript上,你会遇到问题。我尝试使用dts-gen
and生成 .d.ts dtsmake
,但没有成功。所以记住这一点。
选项 3)[推荐] 将“mysql.js”替换为“mysql2.js”包
如上所述,mysql 包(NPM 包链接)仍然存在此问题(截至 2021 年 4 月)。但是 mysql2 包(NPM 包链接)不是。所以可能以下应该是单行答案!
npm un mysql && npm i mysql2
请注意,这mysql2
是流行的分叉作品mysql
,但它的受欢迎程度(2020 年 4 月每周 62 万次下载mysql2
)已经接近原始包(2021mysql
年 4 月每周 72 万次下载),因此进行切换似乎是合理的!