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

Node.js连接MySQL遇ER_ACCESS_DENIED_ERROR权限拒绝错误求助

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:32:49