最近,出于工作需要,涉及到一个技术栈为 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 模块能够支持的加密方式;具体步骤如下:
登录数据库
mysql -uroot -p
更改加密方式
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
重新修改密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YOUR-PWD';
刷新修改
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
});
您可能感兴趣的文章