• 技术
  • 解决 Node.js 连接 MySQL 8.0 报错

解决 Node.js 连接 MySQL 8.0 报错

最近,出于工作需要,涉及到一个技术栈为 Vue、Node.js(Express)、Mysql\Sequelize 的项目;README 并没写名 MySQL 版本,于是从 Mysql 下载地址,便下载了一个新版本 8.0.23(安装可以参见文章:在 Mac OS 环境下安装 MySQL 服务**);安装后,在终端命令行可以正常工作;但与 Node.js 结合的项目运行起来,总会报一个错误:

Unable to connect to the database:Client does not support authentication protocol requested by server; consider upgrading MySQL client .....

经检索发现,导致这个错误的原因是,目前,最新的 Mysql 模块并未完全支持 MySQL 8 的 “caching_sha2_password” 加密方式,而 “caching_sha2_password” 在 MySQL 8 中是默认的加密方式。从而导致已经使用了 “caching_sha2_password” 加密方式,该账号、密码无法在 MySQL 模块中使用,(项目默认是 MySQL 5.* 版本)。其解决方式也比较加单,即从新修改用户 root 的密码,并指定 MySQL 模块能够支持的加密方式;具体步骤如下:

  1. 登录数据库


       mysql -uroot -p
  2. 更改加密方式


       ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
  3. 重新修改密码


       ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YOUR-PWD';
  4. 刷新修改


       FLUSH PRIVILEGES;

采取以上步骤,重新运行,便不再有先前的报错了。但衍生出一个新的报错:

Unable to connect to the database:Access denied for user 'root'@'localhost' (using password: NO)

看起来,这也是 MySQL 5 和 8 版本之间的一个小差异;前者无需填写 password,而后者如果未填写,就会如上报错误;下面是 DB 配置,以及具体所使用的代码:

// MySQL DB config
{
  db: {
    debug: envVars.DB_DEBUG,
    host: envVars.DB_HOST,
    port: envVars.DB_PORT,
    name: envVars.DB_NAME,
    user: envVars.DB_USER,
    password: envVars.DB_PWD // 需要填写 MySQL 安装时所设定的密码;
  },
}
const sequelize = new Sequelize(config.db.name, config.db.user, config.db.password, {
  host: config.db.host,
  port: config.db.port,
  dialect: 'mysql',
  pool: {
    max: 5,
    min: 0,
    acquire: 30000,
    idle: 10000
  },
  define: {
    charset: 'utf8',
    collate: 'utf8_general_ci',
    timestamps: true
  },
  logging: false
});

您可能感兴趣的文章

Write a Reply...