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); }
关键改动说明
- 新增
statusMessage变量存储已发送的消息实例,后续更新直接复用该实例,不再重复发送 - 将
sys.probe包装为Promise,用async/await处理异步逻辑,确保拿到服务器状态后再生成Embed - 移除了多余的
setTimeout,改用setInterval直接调用更新函数,逻辑更清晰 - 用
const声明embed,避免全局变量污染 - 首次执行时发送初始消息,后续仅执行编辑操作
内容的提问来源于stack exchange,提问作者tompano
相关产品推荐
相关产品推荐

