如何在Discord.js v13中正确使用awaitMessages方法
解决Discord.js中awaitMessages仅获取机器人消息的问题
看起来你的问题核心是awaitMessages没有正确过滤出命令发起者的消息,反而误匹配到了机器人自己的消息。我来帮你一步步排查和解决:
1. 修正过滤器逻辑
你的当前过滤器只判断了消息作者ID和命令发起者ID一致,但没有排除机器人本身的消息。如果代码不小心处理了机器人自己发送的消息(比如没在消息事件里排除机器人),就会出现这种匹配错误。
修改过滤器,加上排除机器人的判断:
const msg_filter = m => !m.author.bot && m.author.id === message.author.id;
2. 适配Discord.js版本调整调用方式
不同版本的Discord.js中awaitMessages的用法有差异,这也是常见的踩坑点:
若使用v12版本:
message.channel.awaitMessages(msg_filter, { max: 1, time: 60000, // 建议添加超时时间,避免无限等待 errors: ['time'] }) .then(collected => { const userReply = collected.first(); console.log(`用户回复内容:${userReply.content}`); // 在这里编写处理用户回复的逻辑 }) .catch(() => { message.reply('你超时没有回复哦!'); });
若使用v13及以上版本:
v13+里awaitMessages的参数结构有所变化,需要把过滤器放到配置对象中,同时更推荐用async/await写法:
try { const collected = await message.channel.awaitMessages({ filter: msg_filter, max: 1, time: 60000, errors: ['time'] }); const userReply = collected.first(); console.log(`用户回复内容:${userReply.content}`); // 编写处理用户回复的逻辑 } catch (err) { message.reply('你超时没有回复哦!'); }
3. 排查命令触发的前置逻辑
另外要确保命令处理代码不会处理机器人自己的消息,在消息事件的最开头一定要先排除机器人消息:
client.on('messageCreate', async (message) => { // 先排除机器人发送的消息,避免递归处理 if (message.author.bot) return; // 这里编写你的命令判断逻辑,比如: if (message.content.startsWith('!mycommand')) { // 把awaitMessages的代码放在这里 } });
这样调整后,应该就能正确捕获到命令发起者的消息,不会再误匹配机器人自己的消息了。
内容的提问来源于stack exchange,提问作者Izzy Mailmare
相关产品推荐
相关产品推荐

