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

discord.js Bot每4秒更新Embed失败,重复发送新Embed求助

问题:Discord.js Bot重复发送Embed而非更新已有消息

你当前的代码运行后会重复发送新的Embed消息,而非更新已发送的那条,核心问题在于定时器逻辑错误,且每次执行都重新发送消息,没有复用已有的消息实例。

错误原因分析

  • setInterval(updateEmbed, 4000)每4秒就会触发一次updateEmbed函数,而函数内部每次都调用message.channel.send发送新消息,导致不断刷屏
  • 嵌套的setTimeout参数位置错误(时间参数写在了then回调的外面),且逻辑完全多余,无法实现更新已有消息的目的
  • embed变量未声明,可能造成全局变量污染

修正后的代码

if (cmd === 'fivemst') {
  // 存储需要更新的消息实例
  let statusMessage;

  // 封装状态更新逻辑
  async function updateStatus() {
    // 将sys.probe转为Promise,方便用async/await处理异步
    const isAlive = await new Promise(resolve => {
      sys.probe('cfx.re', resolve);
    });

    // 创建状态Embed
    const embed = new MessageEmbed()
      .setAuthor(
        'FiveM System Status -',
        'https://cdn.discordapp.com/attachments/1041091660316160032/1053741836725915818/82d62076a21ee0f408aa344403324efb5eb669cd.png'
      )
      .setDescription(isAlive 
        ? `✅\n\n**All Systems Operational**` 
        : `❎\n\n**Partial System Outage**`);

    if (statusMessage) {
      // 已有消息实例,直接编辑更新
      await statusMessage.edit({ embeds: [embed] });
    } else {
      // 首次执行,发送消息并保存实例
      statusMessage = await message.channel.send({ embeds: [embed] });
    }
  }

  // 立即执行一次初始化
  updateStatus();
  // 每4秒自动更新
  setInterval(updateStatus, 4000);
}

关键改动说明

  1. 新增statusMessage变量存储已发送的消息实例,后续更新直接复用该实例,不再重复发送
  2. 将sys.probe包装为Promise,用async/await处理异步逻辑,确保拿到服务器状态后再生成Embed
  3. 移除了多余的setTimeout,改用setInterval直接调用更新函数,逻辑更清晰
  4. 用const声明embed,避免全局变量污染
  5. 首次执行时发送初始消息,后续仅执行编辑操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:25:17