本地Node.js无法连接树莓派MariaDB报连接池获取超时错误
局域网连接树莓派MariaDB连接池超时问题解决
ER_GET_CONNECTION_TIMEOUT报错的核心原因是Node服务的连接池在设定的超时窗口内,没能和目标数据库建立有效TCP连接,不是SQL语法错误,也不是连接池本身的参数问题,按以下优先级排查即可:
- 第一步先做基础网络连通性校验
在运行Node服务的本地电脑上打开终端,先执行ping 192.168.0.45确认树莓派在线、和本机在同一局域网。如果ping不通,先检查树莓派供电、WiFi/网线连接,确认路由器分配给树莓派的IP没有变动(家用路由器DHCP默认租期短,经常会导致设备IP变化,建议给树莓派绑定静态IP)。
ping通后执行端口探测:Windows PowerShell下执行Test-NetConnection 192.168.0.45 -Port 3306,类Unix系统执行nc -zv 192.168.0.45 3306。如果端口探测失败,直接去树莓派侧改配置:- SSH登录树莓派,编辑MariaDB服务配置文件,默认路径为
/etc/mysql/mariadb.conf.d/50-server.cnf,找到bind-address配置项,默认值为127.0.0.1(仅允许本机访问数据库),修改为bind-address = 0.0.0.0,保存文件。 - 执行
sudo systemctl restart mariadb重启数据库服务,再回头探测3306端口,直到显示端口开放。 - 如果树莓派开启了ufw防火墙,额外执行
sudo ufw allow 3306/tcp放通数据库端口。
- SSH登录树莓派,编辑MariaDB服务配置文件,默认路径为
- 第二步校验数据库账号的远程访问权限
端口通了还是连不上的话,在树莓派本地登录MariaDB命令行,执行以下SQL查看root账号的允许访问范围:
如果查询结果里root对应的host值为SELECT user, host FROM mysql.user WHERE user = 'root';localhost或127.0.0.1,说明root账号默认仅允许本机登录,没有远程访问权限,执行以下SQL授权:GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '*hello*'; FLUSH PRIVILEGES;注意:生产环境不建议直接用root账号远程连接,也不建议允许所有IP访问,最好单独创建业务账号,仅授权forum库的操作权限,且限制仅你的本地电脑IP可连,测试环境可以暂时用上面的配置快速验证。
- 第三步修正代码里的配置和逻辑问题
你的连接池配置没有显式指定端口,虽然MariaDB默认端口是3306,显式声明可以避免环境变量带来的异常,同时可以适当调长连接获取超时时间,适配局域网偶发的网络波动,修改后的配置参考:
另外你现有代码里的INSERT语句有明显语法问题:语句里只写了2个占位符,但实际传了4个参数,就算连接成功,执行到这一步也会抛参数不匹配的错误,需要和const pool = mariadb.createPool({ host: '192.168.0.45', port: 3306, user:'root', password: '*hello*', connectionLimit: 5, acquireTimeout: 20000 // 连接获取超时调整为20秒 });forum.utilisateur表的字段数对齐后再执行。同时现有连接释放逻辑有漏洞,极端场景下会出现连接泄漏占满连接池,建议改成async/await写法统一处理连接释放。 - 最后兜底排查
如果以上步骤都做完还是连不上,检查本地电脑的防火墙、杀毒软件有没有拦截Node进程的出站请求,部分安全软件会默认拦截非浏览器程序的局域网端口访问,临时关闭安全软件测试即可定位问题。
内容的提问来源于stack exchange,提问作者jojubluch
相关产品推荐
相关产品推荐

