Express连接Azure MySQL失败:访问拒绝错误求助
解决Express连接Azure MySQL时的Access Denied错误
你遇到的错误信息如下:
Error: Access denied for user ''@'localhost' (using password: NO) code: 'ER_ACCESS_DENIED_ERROR', error: 1045, sql:undefined, sqlState: '28000', sqlMessage: "Access denied for user ''@'localhost' (using password: NO)"
这个错误的核心原因是数据库连接池未加载正确的配置参数,以下是具体修复步骤:
1. 修复db.js的配置引用
你的db.js中createPool方法传入的是空对象,没有读取config.js里的数据库配置,修改后代码如下:
import { createPool } from 'mysql2/promise'; import { config } from './config.js'; export const pool = createPool(config.db);
2. 修正环境变量与端口冲突问题
config.js里数据库端口使用了process.env.PORT,会和Express的服务端口(4000)冲突,需要调整:
- 在项目根目录的
.env文件中添加数据库端口配置:
HOSTNAME=你的Azure MySQL服务器地址(格式:xxx.mysql.database.azure.com) USER=你的数据库用户名(格式:用户名@服务器名) PASSWORD=你的数据库密码 DATABASE=目标数据库名称 DB_PORT=3306 # Azure MySQL默认端口
- 修改
config.js中的数据库端口配置:
export const config = { db: { host: process.env.HOSTNAME, user: process.env.USER, password: process.env.PASSWORD, database: process.env.DATABASE, port: process.env.DB_PORT // 替换为DB_PORT避免冲突 } };
3. 验证Azure MySQL防火墙设置
登录Azure门户进入你的MySQL服务器,在「连接安全性」页面:
- 确保「允许访问Azure服务」设为「是」(测试场景)
- 添加当前主机的公网IP到防火墙规则,确保本地能正常访问Azure服务器
4. 确认数据库用户权限
确保使用的数据库用户拥有目标数据库的访问权限,可通过Azure门户或SQL语句授权:
GRANT ALL PRIVILEGES ON `你的数据库名`.* TO '你的用户名@你的服务器名'; FLUSH PRIVILEGES;
附你提供的原始代码(格式化后)
index.js
import express from "express"; import {PORT} from "./config.js"; import indexRoutes from './routes/index.routes.js' const app = express(); app.use(indexRoutes); app.listen(PORT); console.log(`Server listening on port ${PORT}`);
config.js
import dotenv from 'dotenv' dotenv.config() export const config = { db: { host: process.env.HOSTNAME, user: process.env.USER, password: process.env.PASSWORD, database: process.env.DATABASE, port: process.env.PORT } }; export const PORT = 4000;
index.routes.js
import { Router } from "express"; import { pool } from "../db.js"; const router = Router(); router.get("/ping", async (req, res) => { const result = await pool.query("SELECT 1 + 1 as result"); console.log(result); res.json("ping"); }); export default router;
db.js(原始错误版本)
import {createPool} from 'mysql2/promise'; export const pool = createPool({ });
内容的提问来源于stack exchange,提问作者Aarón Bepop
相关产品推荐
相关产品推荐

