You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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几乎完全一致,改代码成本极低:

  1. 先安装包:
npm install mysql2
  1. 连接代码只需要改一行引入:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:07:45