Discord.js机器人无法编辑倒计时消息问题求助
Discord 倒计时机器人消息实时更新问题
我要实现一个通过/timer minutes seconds命令触发的倒计时器,用户可自定义时长。目前机器人能回复该命令发送计时器,但希望消息能随倒计时实时更新。我可以用console.log正常输出倒计时数值,却始终无法让机器人编辑自身消息,甚至尝试编辑无倒计时的机器人消息也失败了。相关代码如下:
const { SlashCommandBuilder,} = require("@discordjs/builders") const { MessageEmbed, Channel, Message, MessageReaction, Client } = require('discord.js'); const { Countdown } = require('countdown'); module.exports = { data: new SlashCommandBuilder() .setName("timer") .setDescription("Starta en timer") .addNumberOption((option) => option.setName('minutes').setDescription('Set amount of minutes').setRequired(true)) .addNumberOption((option) => option.setName('seconds').setDescription('Set amount of seconds').setRequired(true)), execute: async ({ client, interaction}) => { let minutes = interaction.options.getNumber("minutes") let seconds = interaction.options.getNumber("seconds") let minutesToSeconds = minutes * 60; let time = minutesToSeconds + seconds; let duration = time; let getTime = "Timer: " + duration let interval = setInterval((timerMessage) => { duration--; if(duration == 0) { clearInterval(interval); getTime ="Timer is done" } getTime.edit("Timer: " + duration) console.log(duration) }, 1000) await interaction.reply( getTime ); }, }
问题原因及修复方案
你的代码存在几个核心问题导致无法编辑消息:
getTime是普通字符串,并非Discord的Message对象,调用getTime.edit()完全无效——只有机器人发送的消息实例才能调用编辑方法。- 定时器回调的
timerMessage参数没有传入实际值,属于无效参数。 - 缺少对
interaction.reply()返回消息的捕获,无法拿到可编辑的消息对象。
修复后的完整代码:
const { SlashCommandBuilder } = require("@discordjs/builders"); const { Client } = require('discord.js'); module.exports = { data: new SlashCommandBuilder() .setName("timer") .setDescription("启动倒计时器") .addNumberOption(option => option.setName('minutes') .setDescription("设置分钟数") .setRequired(true)) .addNumberOption(option => option.setName('seconds') .setDescription("设置秒数") .setRequired(true)), execute: async ({ client, interaction }) => { const minutes = interaction.options.getNumber("minutes"); const seconds = interaction.options.getNumber("seconds"); let totalSeconds = minutes * 60 + seconds; // 格式化时间为 MM:SS 格式(自动补零) const formatTime = (sec) => { const mins = Math.floor(sec / 60); const secs = sec % 60; return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`; }; // 发送初始消息并获取可编辑的Message对象 const timerMsg = await interaction.reply({ content: `倒计时: ${formatTime(totalSeconds)}`, fetchReply: true // 必须开启此选项才能拿到消息实例 }); // 启动倒计时定时器 const interval = setInterval(async () => { totalSeconds--; if (totalSeconds <= 0) { clearInterval(interval); await timerMsg.edit("倒计时已结束!"); return; } await timerMsg.edit(`倒计时: ${formatTime(totalSeconds)}`); }, 1000); }, };
关键修复点说明
- 捕获消息实例:调用
interaction.reply()时添加fetchReply: true,才能获取到机器人发送的Message对象,后续才能调用edit()方法。 - 区分字符串与消息对象:直接操作
timerMsg(消息实例)而非普通字符串,确保编辑方法有效。 - 时间格式化:新增
formatTime函数,将总秒数转换为更友好的MM:SS格式。 - 异步处理:定时器回调中的
edit()是异步操作,必须添加await保证执行顺序。
内容的提问来源于stack exchange,提问作者Kron
相关产品推荐
相关产品推荐

