Discord bot通过if语句给embed添加图片时崩溃如何解决?
错误原因排查
你遇到的RangeError [EMBED_FIELD_VALUE]: MessageEmbed field values may not be empty错误和图片链接无关,该报错是由于你传入Embed的某个字段值为空导致的,常见触发场景如下:
- 被删除的消息仅包含附件没有文字内容,
messageDelete.content为空,直接传入setDescription触发空值校验 - 被删除的是私信消息、Webhook消息或系统消息,
messageDelete.guild、messageDelete.author等对象为null,取值时返回空值 - 消息数据未同步到本地缓存,部分字段丢失导致取值为空
附件链接返回AccessDenied是Discord的正常机制:附件的CDN链接带签名校验,消息删除后签名会立即失效,匿名访问就会被拒绝,该问题不会直接触发程序崩溃。
修复方案
给所有Embed字段加空值兜底,同时将Embed构造逻辑包裹在异常捕获块中,避免同步错误未被捕获导致程序崩溃,修改后的代码如下:
client.on('messageDelete', async (messageDelete) => { try { // 字段空值兜底 const deletedContent = messageDelete.content || '*该消息无文字内容*' const guildName = messageDelete.guild?.name || '*私信场景*' const channelName = messageDelete.channel?.name || '*未知频道*' const authorName = messageDelete.author?.username || '*未知用户*' const attachment = messageDelete.attachments.first() const deletionEmbed = new Discord.MessageEmbed() .setColor('RANDOM') .setAuthor(`A message was deleted, content here:`) .setDescription(deletedContent) .addFields( { name: "Server:", value: guildName }, { name: "Channel:", value: `#${channelName}` }, { name: "Deleted by:", value: authorName }, ) .setTimestamp() if (messageDelete.attachments.size !== 0 && attachment?.proxyURL) { // 优先用proxyURL,加兜底判断避免取值错误 deletionEmbed.setImage(attachment.proxyURL) } const channel = await client.channels.fetch("875333721492975646") await channel.send(deletionEmbed) } catch (err) { // 捕获所有同步+异步错误,避免程序崩溃 console.log('消息日志处理失败:', err) } });
额外说明
如果需要保留已删除消息的附件预览,需要在消息发送时就将附件转存到你自己的存储服务中,消息删除后再从自有存储拉取资源即可,直接使用Discord原链接无法正常加载已删除消息的附件。
内容的提问来源于stack exchange,提问作者claire.png
相关产品推荐
相关产品推荐

