技术开发笔记

技术开发笔记



  • 返回主页
  • ChatGPT
  • 站点简介
  • 友情链接
  • 注册登录

解决Node.js mysql客户端不支持认证协议引发的“ER_NOT_SUPPORTED_AUTH_MODE”问题

作者: wencst 分类: javascript,linux,数据库,架构设计,程序设计 发布时间: 2024-01-08 10:56 阅读: 2,208 次

起因

mysql模块(项目地址为https://github.com/mysqljs/mysql)是一个开源的、JavaScript编写的MySQL驱动,可以在Node.js应用中来操作MySQL。但在使用过程中,出现了“ER_NOT_SUPPORTED_AUTH_MODE”问题。

本文介绍了出现该问题的原因及解决方案。

报错信息

当我试图使用mysql模块来连接MySQL 8时,出现了如下错误信息:

D:\workspaceGithub\nodejs-book-samples\samples\mysql-demo\index.js:17
      throw error;
      ^

Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
    at Handshake.Sequence._packetToError (D:\workspaceGithub\nodejs-book-samples\samples\mysql-demo\node_modules\mysql\lib\protocol\sequences\Sequence.js:47:14)
    at Handshake.ErrorPacket (D:\workspaceGithub\nodejs-book-samples\samples\mysql-demo\node_modules\mysql\lib\protocol\sequences\Handshake.js:123:18)
    at Protocol._parsePacket (D:\workspaceGithub\nodejs-book-samples\samples\mysql-demo\node_modules\mysql\lib\protocol\Protocol.js:291:23)
    at Parser._parsePacket (D:\workspaceGithub\nodejs-book-samples\samples\mysql-demo\node_modules\mysql\lib\protocol\Parser.js:433:10)
    at Parser.write (D:\workspaceGithub\nodejs-book-samples\samples\mysql-demo\node_modules\mysql\lib\protocol\Parser.js:43:10)
    at Protocol.write (D:\workspaceGithub\nodejs-book-samples\samples\mysql-demo\node_modules\mysql\lib\protocol\Protocol.js:38:16)
    at Socket.<anonymous> (D:\workspaceGithub\nodejs-book-samples\samples\mysql-demo\node_modules\mysql\lib\Connection.js:91:28)
    at Socket.<anonymous> (D:\workspaceGithub\nodejs-book-samples\samples\mysql-demo\node_modules\mysql\lib\Connection.js:525:10)
    at Socket.emit (events.js:196:13)
    at addChunk (_stream_readable.js:290:12)
    --------------------
    at Protocol._enqueue (D:\workspaceGithub\nodejs-book-samples\samples\mysql-demo\node_modules\mysql\lib\protocol\Protocol.js:144:48)
    at Protocol.handshake (D:\workspaceGithub\nodejs-book-samples\samples\mysql-demo\node_modules\mysql\lib\protocol\Protocol.js:51:23)
    at Connection.connect (D:\workspaceGithub\nodejs-book-samples\samples\mysql-demo\node_modules\mysql\lib\Connection.js:119:18)
    at Object.<anonymous> (D:\workspaceGithub\nodejs-book-samples\samples\mysql-demo\index.js:12:12)
    at Module._compile (internal/modules/cjs/loader.js:759:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:770:10)
    at Module.load (internal/modules/cjs/loader.js:628:32)
    at Function.Module._load (internal/modules/cjs/loader.js:555:12)
    at Function.Module.runMain (internal/modules/cjs/loader.js:826:10)
    at internal/main/run_main_module.js:17:11

出错原因

导致这个错误的原因是,目前,最新的mysql模块并未完全支持MySQL 8的“caching_sha2_password”加密方式,而“caching_sha2_password”在MySQL 8中是默认的加密方式。因此,下面的方式命令是默认已经使用了“caching_sha2_password”加密方式,该账号、密码无法在mysql模块中使用。

mysql> ALTER USER 'root'@'%' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.12 sec)

然后查看mysql的用户表

mysql> select host,user,plugin from user \G;
*************************** 1. row ***************************
  host: %
  user: root
plugin: caching_sha2_password
*************************** 2. row ***************************
  host: localhost
  user: mysql.infoschema
plugin: caching_sha2_password
*************************** 3. row ***************************
  host: localhost
  user: mysql.session
plugin: caching_sha2_password
*************************** 4. row ***************************
  host: localhost
  user: mysql.sys
plugin: caching_sha2_password
*************************** 5. row ***************************
  host: localhost
  user: root
plugin: caching_sha2_password
5 rows in set (0.00 sec)

解决方法

解决方法是从新修改用户root的密码,并指定mysql模块能够支持的加密方式:

mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
Query OK, 0 rows affected (0.12 sec)

上述语句,显示指定了使用“mysql_native_password”的加密方式。这种方式是在mysql模块能够支持。

 

mysql> select host,user,plugin from user \G;
*************************** 1. row ***************************
  host: %
  user: root
plugin: mysql_native_password
*************************** 2. row ***************************
  host: localhost
  user: mysql.infoschema
plugin: caching_sha2_password
*************************** 3. row ***************************
  host: localhost
  user: mysql.session
plugin: caching_sha2_password
*************************** 4. row ***************************
  host: localhost
  user: mysql.sys
plugin: caching_sha2_password
*************************** 5. row ***************************
  host: localhost
  user: root
plugin: caching_sha2_password
5 rows in set (0.00 sec)

再此运行应用,可以看到如下的控制台输出信息:

$ node index.js

The result is:  RowDataPacket { user_id: 1, username: '老卫' }
其中,“RowDataPacket { user_id: 1, username: ‘老卫’ }”就是数据库查询的结果。

源码

本节例子可以在https://github.com/waylau/nodejs-book-samples的“mysql-demo”应用中找到。

参考引用

  • 本文同步至: https://waylau.com/node.js-mysql-client-does-not-support-authentication-protocol/
  • 有关MySQL 8的“caching_sha2_password”加密方式,可见https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password

 

 

 

 

 

 

mysqlnode

如果文章对您有用,扫一下支付宝的红包,不胜感激!

欢迎加入QQ群进行技术交流:656897351(各种技术、招聘、兼职、培训欢迎加入)



Leave a Reply Cancel reply

You must be logged in to post a comment.

更多阅读
  • Spring Boot 项目启动报错: Unable to start embedded
  • Eclipse 2024-12版本安装后打开maven项目报错jar in project cannot be read or is not a valid ZIP file
  • 暴风雨中奔跑时,请记得我们《在一起》
  • 查看mysql已经执行过的sql语句
  • rabbitmq用配置文件配置集群
  • DevSidecar加速访问GitHub
  • 如何wordpress利用xmlrpc.php文件进行DDos攻击以及防御
  • mongo操作
  • Arthas – java线上问题处理终极利器
  • Spring Cloud之Finchley版学习(二十六)-使用Elasticsearch作为Zipkin Server的后端存储
  • 为什么读小说会欲罢不能?这本书为你解开小说创作技巧
  • 致传统企业朋友:不够痛就别微服务,有坑
标签云
aliyun android centos CICD DevOps dns docker docker-compose eclipse finchley git Hystrix innodb java k8s kubeadm kubernetes linux maven mongo mysql network nexus nginx node redis registry spring spring boot spring cloud zuul 主从复制 事务 优化 分布式 分库分表 大数据 微服务 推荐 架构 死锁 算法 索引 网络 锁

打赏支持

wencst支付宝wencst微信钱包

扫描二维码,输入您要打赏的金额

2017 技术开发笔记 | 京ICP备16044273号-1 | 京公网安备 11011502005673号

Powered by WordPress. Theme by JieStyle Two |