Discord.js特定频道消息自动转Embed二次执行报错如何解决?
问题原因
- 逻辑判断写反:你用指定频道ID字符串调用
includes()判断是否包含当前频道ID,逻辑完全错误,正确逻辑应该是判断当前频道ID是否等于你要监听的指定ID。 - if语句未加花括号:只有紧随if的
var test行受判断条件控制,后续创建Embed、发消息、删消息的代码不管频道是否匹配都会执行,遇到非目标频道的空消息就会触发报错。 - 方法使用错误:
slice(" ")的参数不符合语法要求,字符串slice()方法接收的是数字索引,传字符串没有实际作用,如果你要去除消息首尾空格应该用trim()。 - 缺少空内容校验:如果用户发送的是纯附件、贴纸、表情,
message.content为空字符串,直接传给Embed字段就会触发你遇到的RangeError [EMBED_FIELD_VALUE]报错,Discord要求Embed的字段值必须是非空字符串。
修复后的代码
const targetChannelId = "905504402276765766"; // 仅匹配指定频道的消息才执行逻辑 if (message.channel.id === targetChannelId) { // 处理消息内容,去除首尾空格 let reportContent = message.content.trim(); // 兼容空内容场景 if (!reportContent) { reportContent = "用户未输入文字内容,仅上传了附件/贴纸等资源"; } const tryembed = new Discord.MessageEmbed() .setColor('DARK_RED') .setTitle('Test') .addFields( {name: "提交Bug的用户:", value: `<@!${message.author.id}>`}, {name: "提交的Bug内容:", value: reportContent} ) // 发送后删除原消息 message.channel.send({embeds: [tryembed]}) .then(() => message.delete()) .catch(err => console.log("消息处理失败:", err)); }
如果你外层的消息监听函数是async修饰的,可以把发送和删除的部分改成await写法,更易读:
await message.channel.send({embeds: [tryembed]}); await message.delete();
内容的提问来源于stack exchange,提问作者I need Help
相关产品推荐
相关产品推荐

