NextJS使用环境变量初始化MySQL连接触发ER_NOT_SUPPORTED_AUTH_MODE错误
问题分析与解决方案
问题重现
硬编码数据库配置时连接完全正常,但改用环境变量配置后触发以下认证错误:
{ code: 'ER_NOT_SUPPORTED_AUTH_MODE', errno: 1251, sqlMessage: 'Client does not support authentication protocol requested by server; consider upgrading MySQL client', sqlState: '08004', fatal: true }
当前配置文件 .env.local 内容:
MYSQL_HOST: localhost MYSQL_USER: root MYSQL_PASSWORD:************ MYSQL_DB:***
数据库连接代码:
const mysql = require("mysql"); var db = mysql.createConnection({ host: process.env.MYSQL_HOST, user: process.env.MYSQL_USER, password: process.env.MYSQL_PASSWORD, database: process.env.MYSQL_DB, }); db.connect((err) => { if (err) { console.log(err); } else { console.log("connected to db"); } }); module.exports = db;
解决方案
1. 修复.env文件格式错误
dotenv 模块默认使用**等号(=)**而非冒号(:)定义环境变量,当前格式会导致参数无法正确读取。修改 .env.local 为:
MYSQL_HOST=localhost MYSQL_USER=root MYSQL_PASSWORD=************ MYSQL_DB=***
2. 确保dotenv模块正确加载
如果项目未安装 dotenv,先执行安装:
npm install dotenv --save
然后在数据库连接代码的最顶部添加加载逻辑,指定读取 .env.local 文件:
require('dotenv').config({ path: '.env.local' }); const mysql = require("mysql"); // 后续连接代码保持不变
3. 验证环境变量读取状态
可以临时添加打印代码,确认参数是否正确加载:
require('dotenv').config({ path: '.env.local' }); const mysql = require("mysql"); // 打印参数排查问题 console.log('数据库地址:', process.env.MYSQL_HOST); console.log('用户名:', process.env.MYSQL_USER); var db = mysql.createConnection({ host: process.env.MYSQL_HOST, user: process.env.MYSQL_USER, password: process.env.MYSQL_PASSWORD, database: process.env.MYSQL_DB, }); // ...后续代码
4. 兼容MySQL 8.0+新认证方式
若上述步骤修复后仍出现认证错误,说明当前 mysql 包不支持MySQL 8.0+默认的 caching_sha2_password 认证插件,切换为 mysql2 包即可解决:
npm uninstall mysql npm install mysql2
修改连接代码中的引入:
require('dotenv').config({ path: '.env.local' }); const mysql = require("mysql2"); // 替换为mysql2 // 后续连接代码保持不变
内容的提问来源于stack exchange,提问作者Jathin Kotian
相关产品推荐
相关产品推荐

