密码都对Node.js却连不上Linux服务器的解决方案
作者:百万前端向前冲
密码都对却连不上,多半不是密码本身的问题,而是Linux服务器上数据库的监听、权限或防火墙配置没放开,MySQL和PostgreSQL默认都只允许本机访问,远程连不上是常见现象,本文介绍密码都对Node.js却连不上Linux服务器的解决方案,感兴趣的朋友一起看看吧

代码已经部署在本地,确认MySQL运行中,反复核对密码都对。需要增加socketPath
const DB = {
socketPath: '/var/run/mysqld/mysqld.sock',
host: 'localhost',
user: 'root',
password: '',
database: 'room520',
// port 删掉!socket模式不使用端口,写了也无效
};
const conn = await mysql.createConnection(DB);
这个配置在 Linux 下大概率连不上,原因要分开讲清楚:
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
const DB = {
socketPath: '/var/run/mysqld/mysqld.sock',
host : 'localhost',
user : 'root',
password: '',
database: 'room520',
};✅ 这个是 socket 连接,不需要端口,空密码root可以连上。 ⚠️ 缺点:只能本机运行,不能远程;环境迁移容易出错,不推荐业务脚本长期用。
方案2:TCP方式(推荐,用dudubb账号,port=3380,稳定)
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版本?
到此这篇关于密码都对Node.js却连不上Linux服务器的解决方案的文章就介绍到这了,更多相关Node.js连不上Linux服务器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
