You need to enable JavaScript to run this app. Discord bot通过if语句给embed添加图片时崩溃如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 20:09:01