discord.js连接群晖NAS远程MySQL数据库报PROTOCOL_PACKETS_OUT_OF_ORDER错误
问题原因分析
- 群晖NAS自带的MariaDB/MySQL服务默认仅监听本地回环地址,你填写的3307端口大概率是phpMyAdmin的web服务端口,不是实际的数据库服务端口,node-mysql客户端把web服务的响应当成了MySQL协议包,才会抛出包顺序错乱的错误。
- 你使用的
mysqlnpm包是已停止维护的旧版本,对群晖NAS预装的高版本MariaDB兼容性差,也会触发协议解析错误。 - 数据库用户
JAWS没有绑定你运行Discord机器人的主机IP访问权限,数据库返回的拒绝访问报文没有被客户端正确解析,也会导致该报错。
解决步骤
- 确认数据库服务端口和监听地址
- 登录群晖NAS后台,打开「MariaDB」设置项,勾选「启用TCP/IP连接」,端口默认是3306,可根据需求自定义,注意不要和phpMyAdmin的端口混淆,phpMyAdmin的端口是web访问端口,不能用来直连数据库。
- 确认群晖防火墙开放你设置的数据库端口的入站规则,允许机器人所在主机的IP访问。
- 替换兼容性更好的数据库依赖
- 卸载旧的
mysql包,安装目前仍在维护中的mysql2包,对MariaDB和新版MySQL兼容性更好:
npm uninstall mysql npm install mysql2
- 修改连接代码,仅需替换引用的依赖即可,API基本兼容原有写法:
// 仅替换第一行引用的包 const mysql = require('mysql2'); var con = mysql.createConnection({ host: '192.168.1.86', // 端口填写MariaDB设置里的端口,不要填phpMyAdmin的端口 port: 3306, user: 'JAWS', password: 'Coccodrillone_05', database: 'JAWS' }); con.connect(function(err){ if(err){ console.log("连接出错"); console.log(err); }else{ console.log("连接成功"); } })
- 确认数据库用户权限
- 登录群晖的phpMyAdmin,执行SQL语句给
JAWS用户开放对应主机的访问权限,如果你机器人所在主机是固定IP,替换下面的192.168.1.%为你的实际IP段,也可以填%开放所有IP访问(公网环境不建议使用):
GRANT ALL PRIVILEGES ON JAWS.* TO 'JAWS'@'192.168.1.%' IDENTIFIED BY 'Coccodrillone_05'; FLUSH PRIVILEGES;
内容的提问来源于stack exchange,提问作者Timo pek
相关产品推荐
相关产品推荐

