Node.js连接MySQL 8.2.0遇ER_NOT_SUPPORTED_AUTH_MODE错误求助
解决MySQL 8.x与Node.js的认证协议不兼容问题
问题根源
MySQL 8.0+默认使用caching_sha2_password作为用户认证协议,但旧版的mysql npm包不支持该协议,导致连接时报错ER_NOT_SUPPORTED_AUTH_MODE。
方案一:修改MySQL用户的认证方式(适合坚持用旧mysql包的情况)
你之前执行ALTER USER失败,大概率是没替换正确的用户名/密码,或者没刷新权限。按以下步骤来:
- 打开MySQL Workbench,用root用户登录(确保账号有足够权限)
- 执行以下SQL(必须替换成你自己的用户名和真实密码):
-- 替换root为你的数据库用户名,替换为你的真实密码 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的真实密码'; -- 必须执行这句刷新权限,否则修改不生效 FLUSH PRIVILEGES;
- 执行后重新启动MySQL服务(Windows上可以在服务管理器里找到MySQL服务重启)
- 回到Node代码,用原来的
mysql包连接即可。
方案二:换用mysql2包(更推荐,无需修改MySQL配置)
mysql2是mysql包的升级版,原生支持caching_sha2_password认证,维护更活跃,步骤如下:
- 卸载旧的
mysql包,安装mysql2:
npm uninstall mysql npm install mysql2
- 修改你的Node代码,替换成
mysql2的调用(几乎不用改其他配置):
const express = require('express'); const http = require('http'); const socketIO = require('socket.io'); const mysql = require('mysql2'); // 换成mysql2 const db = mysql.createConnection({ host: 'localhost', user: 'root', password: '你的真实密码', database: 'MySQL82', port: 3306, // 这里用数字类型更规范 }); db.connect((err) => { if (err) { console.error('数据库连接失败:', err); return; // 别直接throw,避免程序崩溃 } console.log('Connected to MySQL database'); });
- 运行
node index.js,应该就能正常连接了。
额外排查点
- 确认MySQL服务正在运行(Windows可以通过任务管理器的服务标签页检查)
- 确认3306端口没被其他程序占用
- 检查数据库用户名、密码、数据库名是否完全正确,注意大小写(Windows MySQL默认不区分,但最好统一)
内容的提问来源于stack exchange,提问作者FlynnPen
相关产品推荐
相关产品推荐

