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

如何使用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的用户认证规则就行:

  1. 打开MySQL命令行,用root用户登录:
    mysql -u root -p
    
  2. 执行下面的SQL语句,把你的连接用户(这里是root)的认证方式改成旧的mysql_native_password,记得替换成你自己的密码:
    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'rootpass';
    FLUSH PRIVILEGES;
    
    要是你用的不是root用户,就把'root'@'localhost'换成你实际的用户名和主机地址。
  3. 重启MySQL服务,再跑你的Express项目,应该就能正常连接了。

方法2:换成支持新认证的mysql2库

如果想保留MySQL 8.0的默认认证方式,推荐换用mysql2这个npm包,它原生支持caching_sha2_password:

  1. 先卸载旧的mysql包:
    npm uninstall mysql
    
  2. 安装mysql2:
    npm install mysql2
    
  3. 改一下你的代码,把导入的包换成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!');
      });
    });
    
  4. 重新启动项目,连接问题就解决了。

另外提个小建议:你现在的代码只创建了连接但没关闭,最好在完成数据库操作后调用connection.end()来释放连接,避免资源浪费哦。

内容的提问来源于stack exchange,提问作者Diego Izquierdo Dussan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:04:38