You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 09:07:29