Appearance
Egg.js 连接 MySQL8 失败问题
使用 Egg.js < 5.0 连接 MySQL 8 时会出现报错:
ERROR 62740 nodejs.ER_NOT_SUPPORTED_AUTH_MODEError: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client问了 AI,给的原因没问题,就是解决方案扯淡。出现这个问题的原因是:
是 MySQL 8.0+ 默认使用 caching_sha2_password 认证插件,而你的 Node.js MySQL 客户端(如 mysql 或 mysql2)版本较旧,不支持该认证方式 导致的。
于是到 eggjs/mysql 的 issue#31 中找到了解决方案。将 eggjs/mysql 更换为 @eggjs/rds 即可。
具体操作步骤
禁用 eggjs/mysql 插件
js
// 注释掉下面这段配置
// mysql: {
// enable: true,
// package: 'egg-mysql'
// },MySQL 配置
config/config.[env].js 中的 mysql 配置不需要动,如果没有这段配置,则需要加上。或者存在哪里都好,能在 app.js 中调用到就行。
js
exports.mysql = {
// 只有这些配置是必要的
client: {
host: '',
port: '',
user: '',
password: '',
database: ''
},
}安装 @eggjs/rds
shell
$ pnpm install @eggjs/rds将 @eggjs/rds 挂载到 app.mysql
在之前使用 eggjs/mysql 的时候,我们是用
js
this.app.mysql来获取到 mysql 的实例并操作数据库的,所以更换为 @eggjs/rds 之后我们希望可以依然用之前的方式来调用 mysql。所以需要修改 app.js 来手动挂载。
如果代码根目录下没有 app.js,则需要手动创建。
js
const { RDSClient } = require('@eggjs/rds')
module.exports = app => {
const db = new RDSClient(app.config.mysql.client)
app.mysql = db
}完成。