Discord前缀触发型自动回复机器人无响应问题排查求助
你的机器人完全没响应,主要是代码里的几个关键逻辑错误和版本适配问题导致的,我一个个给你拆解清楚:
1. Discord.js事件名称已变更
从Discord.js v13版本开始,原来的message事件就被废弃了,现在官方推荐用messageCreate事件来监听用户消息。你现在还在监听message,机器人根本接收不到用户的消息,自然不会有任何反应。
修复方式:把代码里的client.on('message', ...)改成client.on('messageCreate', ...)。
2. 命令匹配逻辑完全错位
你写的if (responseObject[message.content])犯了个低级错误:message.content是带前缀的完整消息(比如用户发的!ping),但你的responseObject的键是不带前缀的ping,这永远不可能匹配成功。而且你已经把提取好的命令存在command变量里了,应该用这个变量来做匹配才对。
修复方式:把判断条件改成if (responseObject[command]),发送回复时也要对应改成responseObject[command]。
3. 未定义变量引发的隐性报错
在你的responseObject里,写了msg.createdTimestamp,但这里的msg是在后面的.then(async (msg) => { ... })回调里才定义的,提前使用会直接触发ReferenceError: msg is not defined,这个错误会让你的回复逻辑直接中断,就算前面的问题都修复了,机器人也会因为报错无法正常工作。
修复方式:把msg.createdTimestamp换成Date.now(),用来计算从用户发消息到机器人准备回复的延迟:
"ping": ` Latency is ${Date.now() - message.createdTimestamp}ms. API Latency is ${Math.round(client.ws.ping)}ms`
修复后的完整代码
我把所有问题都修正后的代码放在下面,你可以直接参考使用:
const Discord = require('discord.js'); const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]}); const prefix = '!' client.on('ready', () => { let botStatus = [ 'up!h or up!help', `${client.users.cache.size} citizens!`, `${client.guilds.cache.size} servers!` ] setInterval(function(){ let status = botStatus[Math.floor(Math.random() * botStatus.length)] client.user.setActivity(status, {type: 'WATCHING'}) }, 15000); console.log(`${client.user.username} is online and ready!`); }); client.on('messageCreate', message => { if(!message.content.startsWith(prefix) || message.author.bot) return const args = message.content.slice(prefix.length).split(/ +/) const command = args.shift().toLowerCase() const responseObject = { "ping": ` Latency is ${Date.now() - message.createdTimestamp}ms. API Latency is ${Math.round(client.ws.ping)}ms` }; if (responseObject[command]) { message.channel.send('Loading data...').then(async (msg) =>{ msg.delete() message.channel.send(responseObject[command]); }).catch(err => console.log(err.message)) } }); client.login(process.env.token);
额外需要确认的配置项
除了代码问题,你还要检查这几个点:
- 机器人的Token是否正确配置在环境变量
process.env.token中,有没有拼写错误 - 机器人是否已经被邀请到目标服务器,并且拥有发送消息和管理消息的权限(因为你用到了
msg.delete()方法) - 在Discord开发者平台的机器人页面,确认「Privileged Gateway Intents」下的「服务器成员意图」和「消息内容意图」已经开启,否则机器人无法正常接收消息内容
内容的提问来源于stack exchange,提问作者yosuadaniel

