nodejs连接mysql的坑:“Access denied for user ‘root‘@‘localhost‘ (using password: YES)“

本文介绍了在使用Node.js的Express框架连接MySQL时遇到的ER_ACCESS_DENIED_ERROR错误,并提供了详细的解决方案,包括如何重置MySQL密码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在使用Node的express框架连接mysql数据库时碰到了以下错误:

  code: 'ER_ACCESS_DENIED_ERROR',
  errno: 1045,
  sqlMessage: "Access denied for user 'root'@'localhost' (using password: YES)",
  sqlState: '28000',
  fatal: true

经过几番查询最后才弄清楚时因为Mysql服务器通过拒绝访问进行响应,这就需要我们重置mysql的密码。

因此我们就可以使用此命令来进行密码修改:

update MySQL.user set authentication_string=password(123)(新密码)  where
user='python'(用户名)    
//刷新
flush privileges; 

因为我使用的mysql版本是8.0以上的,会报以下语法错误。

所以我最终使用了这种方式进行密码修改(这种方式不用进入mysql,可直接使用终端进行):

MySQLadmin -upython -p password 新密码

密码修改完成后再进行连接会发现连接成功。数据也可以获取到

 

Error: Access denied for user 'root'@'localhost' (using password: YES) at PromisePool.query (E:\OneDrive\桌面\node\node_modules\mysql2\lib\promise\pool.js:36:22) at createTable (E:\OneDrive\桌面\node\mysql.js:22:34) at main (E:\OneDrive\桌面\node\mysql.js:58:11) at Object.<anonymous> (E:\OneDrive\桌面\node\mysql.js:77:3) at Module._compile (node:internal/modules/cjs/loader:1469:14) at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) at Module.load (node:internal/modules/cjs/loader:1288:32) at Module._load (node:internal/modules/cjs/loader:1104:12) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:174:12) at node:internal/main/run_main_module:28:49 { code: 'ER_ACCESS_DENIED_ERROR', errno: 1045, sql: undefined, sqlState: '28000', sqlMessage: "Access denied for user 'root'@'localhost' (using password: YES)" } E:\OneDrive\桌面\node\node_modules\mysql2\lib\promise\pool.js:36 const localErr = new Error(); ^ Error: Access denied for user 'root'@'localhost' (using password: YES) at PromisePool.query (E:\OneDrive\桌面\node\node_modules\mysql2\lib\promise\pool.js:36:22) at createUser (E:\OneDrive\桌面\node\mysql.js:27:33) at Object.<anonymous> (E:\OneDrive\桌面\node\mysql.js:33:3) at Module._compile (node:internal/modules/cjs/loader:1469:14) at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) at Module.load (node:internal/modules/cjs/loader:1288:32) at Module._load (node:internal/modules/cjs/loader:1104:12) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:174:12) at node:internal/main/run_main_module:28:49 { code: 'ER_ACCESS_DENIED_ERROR', errno: 1045, sql: undefined, sqlState: '28000', sqlMessage: "Access denied for user 'root'@'localhost' (using password: YES)" } Node.js v20.17.0
03-08
<think>好的,我现在需要解决用户遇到的MySQL连接问题,错误是“Access denied for user 'root'@'localhost' (using password: YES)”。首先,我得分析可能的原因。用户使用的是Node.js的mysql2库,所以应该检查连接配置是否正确。 首先,用户可能在代码中提供的用户名、密码有误。需要确认连接配置里的密码是否正确,比如是否拼写错误或者用了错误的变量。另外,用户是否在创建MySQL实例时设置了不同的root密码?比如通过安装方式不同,可能默认密码为空或者有其他初始密码。 接下来,用户是否可能没有权限?有时候即使密码正确,root用户的访问权限可能被限制为特定的socket或本地访问方式。比如,某些系统上root只能通过Unix socket登录,而不能通过TCP/IP。这时候可能需要检查用户的权限设置,使用MySQL的GRANT命令重新授权。 另外,MySQL服务器是否正在运行?如果服务未启动,连接也会失败,但错误信息可能不同。不过这里显示的是权限问题,所以可能服务是运行中的。 还有可能用户尝试从远程连接,但root用户默认只允许localhost访问。不过错误信息里显示的是localhost,所以可能不是这个问题。但如果用户配置了不同的主机名或者IP,可能需要检查。 然后,用户可能修改过root密码但未正确更新权限,或者FLUSH PRIVILEGES未执行。这时候可能需要重置root密码。比如在MySQL 8.0以上版本,重置密码的步骤可能有所不同,可能需要停止服务,使用安全模式启动,然后修改密码。 此外,检查MySQL的认证插件是否变更。MySQL 8.0默认使用caching_sha2_password,而旧版的客户端可能不支持,导致认证失败。可能需要将root用户的插件改为mysql_native_password,或者更新客户端库。 用户使用的是mysql2库,这个库通常支持新的认证插件,但最好确认版本是否最新。如果是插件问题,错误信息可能不同,但也不排除可能性。 可能的解决方案步骤包括: 1. 检查连接配置中的用户名和密码是否正确,尤其是密码是否有特殊字符需要转义。 2. 尝试使用命令行工具登录,验证密码是否正确。例如:`mysql -u root -p`,然后输入密码,看能否成功。 3. 如果命令行也无法登录,可能需要重置root密码。步骤包括停止MySQL服务,启动跳过权限检查,登录后修改密码,然后重启服务。 4. 检查用户权限,使用`SELECT user, host FROM mysql.user;`查看root用户的主机权限是否正确,可能需要使用`GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;`来重新授权。 5. 检查认证插件,使用`ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_password';`来更改插件和密码。 6. 确保MySQL服务器允许本地连接,检查配置文件(如my.cnf或my.ini)中的bind-address是否为127.0.0.1或注释掉以允许本地连接。 7. 如果用户修改过root的密码,可能需要重启MySQL服务使更改生效。 用户可能不太熟悉如何操作MySQL的安全模式或修改配置文件,需要给出详细的步骤说明,特别是针对不同操作系统(如Windows)的具体操作。同时,提醒用户在修改密码或权限后执行FLUSH PRIVILEGES命令,或者重启服务以确保更改生效。 另外,用户可能在代码中使用的端口是否正确?默认是3306,但如果有更改,连接配置需要相应调整。不过错误信息中没有提到连接被拒绝,所以端口可能没问题。 最后,建议用户在解决问题后,测试连接是否成功,并考虑是否使用root用户,或者创建一个具有所需权限的专用用户,以提高安全性。</think>这个错误表明你的Node.js应用在尝试使用root用户连接MySQL时被拒绝访问。以下是详细的排查步骤和解决方案: --- ### **错误原因分析** 错误代码 `ER_ACCESS_DENIED_ERROR (1045)` 的常见原因: 1. **密码错误** - 提供的root密码不正确 2. **权限配置问题** - root用户未授权本地登录 3. **认证插件不兼容** - MySQL 8+默认使用`caching_sha2_password`,旧客户端可能不支持 4. **MySQL服务未运行** - 服务未启动(但此错误更可能是权限问题) --- ### **步骤1 - 验证密码是否正确** #### 通过命令行测试登录 ```bash mysql -u root -p ``` - 输入密码后若登录失败,说明密码错误 - 若出现 `ERROR 1045`,继续以下步骤 --- ### **步骤2 - 重置root密码** #### Windows系统操作: 1. **停止MySQL服务**: ```bash net stop mysql ``` 2. **以跳过权限方式启动MySQL**: ```bash mysqld --skip-grant-tables --shared-memory ``` 3. **新终端窗口无密码登录**: ```bash mysql -u root ``` 4. **更新root密码**(MySQL 5.7+): ```sql FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码'; EXIT; ``` 5. **重启MySQL服务**: ```bash net stop mysql net start mysql ``` --- ### **步骤3 - 检查用户权限** 登录MySQL后执行: ```sql SELECT user, host, plugin FROM mysql.user; ``` - 确认 `root@localhost` 存在 - 如果 `plugin` 列为 `caching_sha2_password`,可尝试修改为旧插件: ```sql ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; ``` --- ### **步骤4 - 检查Node.js连接配置** 确保代码中的连接配置正确: ```javascript const pool = mysql.createPool({ host: 'localhost', user: 'root', password: '你的密码', // 检查是否多空格或特殊字符未转义 database: '你的数据库', waitForConnections: true, connectionLimit: 10 }); ``` --- ### **步骤5 - 其他可能问题** 1. **检查MySQL服务状态**: ```bash net start | findstr "MySQL" ``` 若未运行,启动服务: ```bash net start mysql ``` 2. **配置文件问题**: 检查 `my.ini` 或 `my.cnf` 中的配置: ```ini [mysqld] bind-address = 127.0.0.1 # 确保允许本地连接 ``` --- ### **最终验证** 1. 通过命令行登录验证新密码 2. 修改Node.js代码中的密码后重新运行 --- ### **扩展建议** - 避免直接使用root用户,建议创建专用用户: ```sql CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'secure_password'; GRANT ALL PRIVILEGES ON your_database.* TO 'app_user'@'localhost'; FLUSH PRIVILEGES; ``` 如果问题仍未解决,请提供以下信息: 1. MySQL版本 (`mysql --version`) 2. 完整的Node.js连接代码(隐藏敏感信息) 3. 操作系统版本
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值