Node.js连接MySQL遇ER_ACCESS_DENIED_ERROR权限拒绝错误求助
我写了一段简单的MySQL连接代码,但运行时抛出了权限拒绝的错误,错误日志如下:
Error: ER_ACCESS_DENIED_ERROR: Access denied for user 'root'@'127.0.0.1' (using password: YES) at Handshake.Sequence._packetToError (/Volumes/Data/Study/mysql-test/node_modules/mysql/lib/protocol/sequences/Sequence.js:52:14) at Handshake.ErrorPacket (/Volumes/Data/Study/mysql-test/node_modules/mysql/lib/protocol/sequences/Handshake.js:130:18) at Protocol._parsePacket (/Volumes/Data/Study/mysql-test/node_modules/mysql/lib/protocol/Protocol.js:279:23) at Parser.write (/Volumes/Data/Study/mysql-test/node_modules/mysql/lib/protocol/Parser.js:76:12) at Protocol.write (/Volumes/Data/Study/mysql-test/node_modules/mysql/lib/protocol/Protocol.js:39:16) at Socket.<anonymous> (/Volumes/Data/Study/mysql-test/node_modules/mysql/lib/Connection.js:103:28) at Socket.emit (events.js:180:13) at addChunk (_stream_readable.js:274:12) at readableAddChunk (_stream_readable.js:261:11) at Socket.Readable.push (_stream_readable.js:218:10) -------------------- at Protocol._enqueue (/Volumes/Data/Study/mysql-test/node_modules/mysql/lib/protocol/Protocol.js:145:48) at Protocol.handshake (/Volumes/Data/Study/mysql-test/node_modules/mysql/lib/protocol/Protocol.js:52:23) at Connection.connect (/Volumes/Data/Study/mysql-test/node_modules/mysql/lib/Connection.js:130:18) at Object.<anonymous> (/Volumes/Data/Study/mysql-test/app.js:8:12) at Module._compile (module.js:649:30) at Object.Module._extensions..js (module.js:660:10) at Module.load (module.js:561:32) at tryModuleLoad (module.js:501:12) at Function.Module._load (module.js:493:3) at Function.Module.runMain (module.js:690:10)
我的项目结构很简单,只有app.js和package.json两个文件:
package.json 内容
{ "name": "mysql-test", "version": "1.0.0", "description": "", "main": "app.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "mysql": "^2.15.0" } }
app.js 连接代码
const mysql = require('mysql'); const connection = mysql.createConnection({ host: 'localhost', user: 'root', password: 'mypassword', database: 'test', }); connection.connect((err) => { if (err) { throw err; } console.log('Connected!'); });
目前的情况是:
- 已安装MySQL,phpMyAdmin中root用户拥有test数据库的全部权限
- 尝试在连接配置中添加端口号3306,问题依旧
- 终端使用相同的用户名和密码可正常连接test数据库,权限配置齐全,但Node.js代码始终报错,请问问题出在哪里?
问题排查与解决方案
这种情况我碰到过好多次,核心原因其实是终端和Node.js的mysql模块连接MySQL的方式不一样,给你几个具体的排查方向:
1. 检查root用户的主机访问权限
终端连接localhost时,默认用的是Unix socket连接,而Node.js的mysql模块在指定host: 'localhost'时,很多时候会优先尝试TCP/IP连接(也就是通过127.0.0.1)。这时候你需要确认root用户是否允许从127.0.0.1登录:
登录MySQL终端执行以下命令:
SELECT user, host FROM mysql.user WHERE user = 'root';
如果查询结果里只有root@localhost,没有root@127.0.0.1或者root@%(允许任意主机),那就是权限问题。执行以下SQL授权:
GRANT ALL PRIVILEGES ON test.* TO 'root'@'127.0.0.1' IDENTIFIED BY 'mypassword'; FLUSH PRIVILEGES;
授权完成后再运行Node.js代码试试。
2. 强制使用Socket连接
如果你不想修改用户权限,可以直接让Node.js用和终端一样的Socket方式连接。在Mac上,MySQL的Socket路径通常是/tmp/mysql.sock,修改你的连接配置:
const connection = mysql.createConnection({ host: 'localhost', user: 'root', password: 'mypassword', database: 'test', socketPath: '/tmp/mysql.sock' // 添加这一行 });
Windows系统的Socket路径一般是\\\\.\\pipe\\MySQL,可以根据自己的系统调整。
3. 排查密码特殊字符问题
虽然终端能正常使用,但如果密码里包含@、#、$这类特殊字符,有时候Node.js的字符串解析可能会出问题(概率较低,但可以排查)。试试把密码用引号包裹,或者对特殊字符进行转义。
4. 确认MySQL服务的监听地址
检查MySQL配置文件(my.cnf或my.ini)中的bind-address项,确保它设置为127.0.0.1或者0.0.0.0(允许所有地址访问)。如果设置成了其他IP,TCP连接就会被拒绝。
先试试前两个方案,大概率能解决你的问题。
内容的提问来源于stack exchange,提问作者lingjin.w

