部署到Ubuntu 16.04虚拟服务器的Discord Bot不响应命令求助
问题原因及修复方案
1. 缺少必要的Gateway Intents配置
你当前初始化Client只开启了GUILDS这一个intent,完全没有配置消息相关的权限,这是导致Bot收不到消息的最常见原因:
- 首先要在Discord开发者后台的Bot设置页,开启「Message Content Intent」权限
- 修改Client初始化代码,补充必要的intent:
const client = new Client({ intents: [ Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.DIRECT_MESSAGES // 需要接收私聊消息可以补充这个配置 ] });
- 如果你使用的是discord.js v13及以上版本,原来的
client.on("message")事件已经废弃,要改成client.on("messageCreate")才能正常触发消息监听。
2. Node.js版本不兼容
discord.js v13以上要求Node.js版本 >= 16.6.0,Ubuntu 16.04默认软件源的Node.js版本最高只有8.x,完全不满足运行要求:
- 你可以执行
node -v查看当前服务器的Node版本,如果低于要求版本,用nvm安装符合要求的Node版本即可。
3. 数据库操作异步逻辑错误
你写的IsThereAnythingSQL函数是完全无效的,mysql的query是异步回调执行,你函数里直接return false的代码会在数据库查询返回之前就执行,永远拿不到正确的查询结果:
- 可以把数据库查询改成Promise写法,用async/await来处理异步逻辑,修正后的示例如下:
function IsThereAnythingSQL(sql) { return new Promise((resolve, reject) => { connection.query(sql, (err, results, fields) => { if (err) return reject(err); resolve(results.length >= 1); }); }) } // 调用的时候要在async函数里用await: // const exists = await IsThereAnythingSQL("你的SQL语句")
另外也要确认服务器上的MySQL服务正常运行,已经创建了quiz数据库和对应的users表,root用户的密码确实为空,本地和服务器的数据库配置是一致的。
4. 其他检查项
- 执行
node 你的入口文件名.js的时候查看控制台输出,有没有打印I am ready!,如果没打印就是token无效或者登录失败,检查token是否正确、服务器网络能不能正常访问Discord的API - 确认Bot已经被邀请到对应服务器,并且拥有发送消息、读取消息历史的权限
- Ubuntu 16.04的系统防火墙有没有限制出站请求,Discord的API请求被拦截也会导致Bot无响应。
内容的提问来源于stack exchange,提问作者CakePlaysHD
相关产品推荐
相关产品推荐

