You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 14:40:25