Discord.js中如何通过其他命令修改Embed的描述
解决Discord.js中修改已发送Embed时的TypeError问题
看起来你遇到的核心问题是你尝试修改的embed变量是undefined,这是因为你从autostatus.js导入的embed并不是实际发送到频道里的那个Embed实例。下面我来拆解原因并给出解决方案:
为什么会出现这个错误?
- 如果你在
autostatus.js里是每次执行命令时新建一个Embed(比如const embed = new Discord.MessageEmbed(...)),然后没有把这个已发送的Embed对应的消息对象保存下来,那么从其他文件导入的embed要么是未初始化的变量,要么是一个全新的Embed实例,根本不是已经发送到频道里的那个。 - 即使你在
autostatus.js里导出了这个Embed,只要-autostatus命令还没被执行过,这个变量就会是undefined,自然调用setDescription会报错。
正确的解决方案:修改已发送的消息对象
要修改已发送的Embed,你需要操作的是发送Embed后返回的Message对象,而不是原来的Embed实例。具体步骤如下:
步骤1:在autostatus.js中保存已发送的消息对象
修改autostatus.js里发送Embed的代码,把返回的消息对象存储到机器人客户端的全局属性中(这样其他命令可以访问到):
// 假设你原来的发送代码是这样的,修改成: message.channel.send(embed).then(sentMessage => { // 将发送后的消息对象存在client的全局属性里 // 如果是多服务器场景,建议用Map按服务器ID存储,避免互相干扰 client.autoStatusMessage = sentMessage; // 多服务器版本: // if (!client.autoStatusMessages) client.autoStatusMessages = new Map(); // client.autoStatusMessages.set(message.guild.id, sentMessage); });
步骤2:修改-botoff命令的代码
在botoff.js中,获取保存的消息对象,然后编辑它的Embed:
const Discord = require("discord.js") exports.run = (client, message, args) => { if(message.author.id !== "276249983664128001") return; // 先检查是否存在已发送的状态消息 if(!client.autoStatusMessage) { return message.reply("还没有执行过 `-autostatus` 命令生成状态消息哦!"); } // 复制原消息中的Embed并修改描述 const originalEmbed = client.autoStatusMessage.embeds[0]; const updatedEmbed = new Discord.MessageEmbed(originalEmbed) .setDescription("Uptime: Offline Bot Status: Offline"); // 编辑已发送的消息 client.autoStatusMessage.edit({ embeds: [updatedEmbed] }) .catch(err => { console.error("修改状态消息失败:", err); message.reply("修改状态消息时出现错误,请查看控制台日志。"); }); }
额外注意事项
- 多服务器兼容:如果你的机器人在多个服务器使用,不要用单个变量存储消息对象,建议用
Map按服务器ID存储(上面代码里的注释部分),避免不同服务器的状态消息互相覆盖。 - 权限检查:确保机器人拥有编辑消息的权限,否则
edit方法会失败。 - 持久化问题:如果机器人重启,
client.autoStatusMessage会丢失。如果需要持久化,可以把消息ID和频道ID存储到数据库或配置文件中,重启后重新获取消息对象。
内容的提问来源于stack exchange,提问作者TheArkian
相关产品推荐
相关产品推荐

