如何解决Node.js连接MySQL时的ER_ACCESS_DENIED_ERROR错误
注册/登录页面开发中MySQL连接权限错误排查
我用Node.js搭配Express、MySQL、dotenv、hbs、bcryptjs和nodemon开发注册/登录页面,运行代码时控制台返回错误:
{ "code": "ER_ACCESS_DENIED_ERROR", "errno": 1045, "sqlMessage": "Access denied for user ''@'localhost' (using password: NO)", "sqlState": "28000", "fatal": true }
已用管理员用户运行,也尝试过SQL权限赋予操作但无效,两台不同电脑(一台有管理员权限、一台没有)都出现该错误,怀疑问题出在代码或配置结构而非SQL本身。
当前代码与配置
app.js
const express = require('express'); const mysql = require("mysql"); const dotenv = require('dotenv'); const app = express(); dotenv.config({ path: './.env'}); const db = mysql.createConnection({ host: process.env.DATABASE_HOST, user: process.env.DATABASE_USER, password: process.env.DATABASE_PASSWORD, database: process.env.DATABASE }); db.connect((error) => { if(error) { console.log(error) } else { console.log("MySQL connected!") } })
.env文件
DATABASE = logindb DATABASE_HOST = localhost DATABASE_ROOT = root DATABASE_PASSWORD =
已尝试的SQL操作
create database logindb; CREATE TABLE users ( id INT(11) NOT NULL AUTO_INCREMENT, NAME VARCHAR(100), email VARCHAR(100), PASSWORD VARCHAR(255), PRIMARY KEY (id) ); GRANT ALL PRIVILEGES ON users.* TO 'anajo'@'localhost' IDENTIFIED BY ''; FLUSH privileges; SHOW GRANTS FOR 'anajo'@'localhost';
问题原因与解决办法
1. 配置变量不匹配
代码里数据库连接用的是process.env.DATABASE_USER,但.env文件里对应的变量名是DATABASE_ROOT,导致user参数为空字符串,这就是错误提示中''@'localhost'的直接原因。
解决:
修改.env文件,把变量名改成DATABASE_USER:
DATABASE = logindb DATABASE_HOST = localhost DATABASE_USER = root DATABASE_PASSWORD =
或者修改app.js里的变量引用为process.env.DATABASE_ROOT。
2. 权限设置有误(若使用自定义用户anajo)
如果打算用anajo用户连接数据库,需要:
- 在.env里设置
DATABASE_USER = anajo - 修正SQL权限命令,应该授权用户访问整个
logindb数据库,而不是仅users表:
GRANT ALL PRIVILEGES ON logindb.* TO 'anajo'@'localhost' IDENTIFIED BY ''; FLUSH PRIVILEGES;
3. 验证用户登录权限
确认所选用户(root或anajo)可以无密码登录本地MySQL:
打开终端输入mysql -u root(或mysql -u anajo),如果能正常进入MySQL控制台,说明用户登录权限没问题。
最后重启Node服务,测试数据库连接是否正常。
内容的提问来源于stack exchange,提问作者Ana Jullia
相关产品推荐
相关产品推荐

