Sequelize连接MySQL报错:Access denied for user 'someuser'@'localhost'
问题描述
按教程安装配置MySQL后,修改/etc/mysql/mysql.conf.d/mysqld.cnf中的bind-address为0.0.0.0,本地MySQL Workbench可正常连接数据库,但Node.js通过Sequelize连接时出现权限错误。
代码与配置
Sequelize连接代码
import { Sequelize, DataTypes } from "sequelize"; import { logger } from "../utils/index.js"; const sequelize = new Sequelize({ host: process.env.DB_HOST, port: process.env.DB_PORT, database: process.env.DB_NAME, username: process.env.DB_USER, password: process.env.DB_PASS, dialect: "mysql", logging: (msg) => logger(msg, "database"), }); sequelize.authenticate().then(() => { console.log('Connection has been established successfully.'); }).catch((error) => { console.error('Unable to connect to the database: ', error); });
.env配置
DB_HOST=localhost DB_USER=someuser DP_PASS=Somepassword@ DB_PORT=3306 DB_NAME=dbname
错误日志核心信息
Unable to connect to the database: AccessDeniedError [SequelizeAccessDeniedError]: Access denied for user 'someuser'@'localhost' (using password: NO)
环境信息
- Node.js依赖:
sequelize 6.33.0、mysql2 3.6.2 - MySQL版本:
mysql Ver 8.0.35-0ubuntu0.23.04.1 for Linux on x86_64 ((Ubuntu)) - 应用与数据库部署在同一服务器,Workbench连接正常
解决方案
1. 修复.env变量名错误
错误日志明确提示using password: NO,说明Sequelize未获取到密码值。检查.env文件发现密码变量名写成了DP_PASS,但代码中使用的是process.env.DB_PASS,两者不匹配。
修改.env文件:
DB_HOST=localhost DB_USER=someuser DB_PASS=Somepassword@ # 将DP_PASS改为DB_PASS DB_PORT=3306 DB_NAME=dbname
修改后重启应用,重新测试连接。
2. 验证MySQL用户本地连接权限(若第一步无效)
如果密码变量修复后仍报错,需确认someuser拥有从localhost连接的权限:
- 登录MySQL:
mysql -u root -p
- 查看用户权限条目:
SELECT user, host FROM mysql.user WHERE user = 'someuser';
- 若不存在
someuser@localhost条目,创建并授权:
CREATE USER 'someuser'@'localhost' IDENTIFIED BY 'Somepassword@'; GRANT ALL PRIVILEGES ON dbname.* TO 'someuser'@'localhost'; FLUSH PRIVILEGES;
3. 切换连接地址为127.0.0.1
MySQL对localhost优先使用socket连接,若socket权限存在问题,可修改.env中的DB_HOST:
DB_HOST=127.0.0.1
内容的提问来源于stack exchange,提问作者lolz
相关产品推荐
相关产品推荐

