Skip to content

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
}

完成。

最后更新于: