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

Discord.js机器人重复消息命令故障求助:输入指定次数后仅发送一次消息

问题分析与解决方案

嘿,我一眼就瞅出问题所在啦!你当前代码里的核心错误是用错了方法——message.channel.messages.fetch()是用来获取频道历史消息的,和重复发送消息完全不搭边。所以不管你传入多少数字,它只会执行一次message.channel.send(),自然达不到重复发送的效果。

修正后的代码

我给你调整了代码逻辑,用循环来实现指定次数的消息发送,同时还加了小延迟避免触发Discord的发送速率限制:

async execute(message, args) { 
  // 检查是否提供了次数参数
  if(!args[1]) return message.channel.send("`Command Usage:\n-rqplay (amount)`"); 
  const amount = parseInt(args[1]);
  // 验证是否为有效数字
  if(isNaN(amount)) return message.channel.send("Please enter an actual number idiot :rolling_eyes:"); 
  // 限制发送次数范围
  if(amount > 15) return message.channel.send("I don't want to send that many messages :nauseated_face:"); 
  if(amount < 1) return message.reply("Bro come on, are you this stupid?"); 

  // 循环发送指定次数的消息
  for(let i = 0; i < amount; i++) {
    await message.channel.send('@everyone play');
    // 500毫秒延迟,避免刷屏触发限制
    await new Promise(resolve => setTimeout(resolve, 500));
  }
}

关键改动说明

  1. 替换错误方法:移除了无用的messages.fetch()调用,改用for循环控制发送次数
  2. 参数类型转换:把args[1]字符串转成整数amount,避免后续比较时的隐式类型问题
  3. 添加速率控制:加入500毫秒延迟,防止短时间内大量发送消息被Discord限制
  4. 修正拼写小错误:把are this stupid改成了are you this stupid,语法更通顺

额外提示

如果觉得循环加await的方式不够高效,也可以用Promise.all批量处理发送请求,但记得同样要注意速率限制:

// 另一种实现方式:用Promise.all批量发送
const sendPromises = Array.from({length: amount}, () => 
  message.channel.send('@everyone play').then(() => 
    new Promise(resolve => setTimeout(resolve, 500))
  )
);
await Promise.all(sendPromises);

内容的提问来源于stack exchange,提问作者Ethan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 13:32:50