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

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
            );
    },
}

问题原因及修复方案

你的代码存在几个核心问题导致无法编辑消息:

  1. getTime是普通字符串,并非Discord的Message对象,调用getTime.edit()完全无效——只有机器人发送的消息实例才能调用编辑方法。
  2. 定时器回调的timerMessage参数没有传入实际值,属于无效参数。
  3. 缺少对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:35:26