
代码已经部署在本地,确认MySQL运行中,反复核对密码都对。需要增加socketPath
sql
const DB = {
socketPath: '/var/run/mysqld/mysqld.sock',
host: 'localhost',
user: 'root',
password: '',
database: 'room520',
// port 删掉!socket模式不使用端口,写了也无效
};
const conn = await mysql.createConnection(DB);

结论
这个配置在 Linux 下大概率连不上,原因要分开讲清楚:
yaml
const DB = {
host : 'localhost',
user : 'root',
password: '',
port : 3380,
database: 'room520',
};
核心原理(Linux 上 mysql2 的行为)
在 Linux 平台:当
host: 'localhost'时,mysql2 会优先走 Unix socket(mysqld.sock),完全忽略 port 参数! 端口 3380 只对 TCP 连接生效,socket 连接不使用端口。
你现在数据库状态:
-
root@localhost:socket 空密码 ,命令行mysql -uroot直接登录,这是 socket 登录。 -
但是你的JS配置写了
host:'localhost'+port:3380,mysql2 直接走 socket,port 3380 被无视。理论上 socket 模式空密码可以连上,但 mysql2 对空密码 + socket 的兼容不稳定,经常报
ER_ACCESS_DENIED_NO_PASSWORD_ERROR,就是你遇到的报错。
两种可行写法,二选一
方案1:使用socket(对应root空密码,和你命令行登录一致)
去掉port,增加socketPath
csharp
const DB = {
socketPath: '/var/run/mysqld/mysqld.sock',
host : 'localhost',
user : 'root',
password: '',
database: 'room520',
};
✅ 这个是 socket 连接,不需要端口,空密码root可以连上。 ⚠️ 缺点:只能本机运行,不能远程;环境迁移容易出错,不推荐业务脚本长期用。
方案2:TCP方式(推荐,用dudubb账号,port=3380,稳定)
arduino
const DB = {
host : '127.0.0.1', // 重点!写127.0.0.1才会走TCP,读取port
user : 'dudubb',
password: 'Dudubb@123456',
port : 3380,
database: 'room520',
};
host:127.0.0.1= 强制TCP,port=3380生效,不受socket影响。前提:执行ALTER把dudubb改成mysql_native_password。
一句话总结
host:'localhost':Linux mysql2默认socket,port无效,空密码root容易报错。host:'127.0.0.1':TCP连接,port=3380生效,适合Node脚本。
你想试socket的root空密码版本,还是直接用dudubb TCP版本?