Discord.js机器人消息嵌入问题求助:标签报错、附件失效及头像设置
解决Discord.js机器人的Embed处理问题
我来帮你逐个搞定这三个问题,先拆解每个问题的根源,再给出修复方案:
问题1:提及用户时触发API错误
这个错误的核心是你直接把message.attachments传给了setImage()——message.attachments是一个Attachment集合对象,不是字符串格式的URL,当消息没有附件时,它会是空集合,Discord API无法识别这种格式,就会抛出错误。
问题2:附件无法正常显示
同样是setImage()的用法错误,你需要从附件集合里取出具体的附件URL,而不是直接传集合本身。另外要判断消息是否包含附件,再去设置Embed图片,避免传入空值。
问题3:设置作者头像为消息发送者头像
setAuthor()方法支持传入第二个参数作为头像URL,你可以用message.author.displayAvatarURL()获取发送者的头像链接,同时把作者名设为发送者的用户名,体验更直观。
修正后的完整代码
bot.on('message', async message => { // 忽略机器人自身发送的消息 if (message.author.bot) return; // 仅监听指定频道 if (message.channel.id !== "771695635598278677") return; try { // 异步删除原消息,确保后续操作等待删除完成 await message.delete(); // 构建MessageEmbed const darkEmbed = new Discord.MessageEmbed() .setColor('#000000') .setDescription(message.content) // 设置作者:用户名+发送者头像URL .setAuthor(message.author.username, message.author.displayAvatarURL()) .setFooter('twitter', 'https://cdn.discordapp.com/attachments/564032243836780558/771614643159433226/Anonymous_emblem.svg.png'); // 处理附件:存在附件时,设置Embed图片为第一个附件的URL if (message.attachments.size > 0) { const firstAttachment = message.attachments.first(); darkEmbed.setImage(firstAttachment.url); } // 发送最终的Embed await message.channel.send(darkEmbed); } catch (error) { // 捕获并打印错误,避免控制台抛出未处理的Promise拒绝 console.error('处理消息时发生错误:', error); } });
关键修改说明
- 加入
async/await:因为message.delete()和message.channel.send()都是异步操作,用await确保执行顺序,同时用try/catch捕获异常,避免控制台报错。 - 修正
setImage()逻辑:只有当消息包含附件时,才取出第一个附件的URL传入,彻底解决空值/集合格式导致的API错误。 - 完善
setAuthor():传入发送者的用户名和头像URL,满足你的需求。 - 移除无效的
addField('\n'):addField需要至少标题和内容两个参数,多余的空字段会导致Embed异常。 - 修正变量名混淆:你原代码里定义了
dark但发送了twitter,现在统一为darkEmbed避免逻辑混乱。
这样修改后,三个问题都能解决:提及用户时不会再触发错误,附件能正常显示在Embed中,作者头像也会同步为消息发送者的头像。
内容的提问来源于stack exchange,提问作者GreatShark
相关产品推荐
相关产品推荐

