You need to enable JavaScript to run this app. 如何在discord.js消息嵌入中显示本地图片?附件返回undefined排查
优惠活动
大模型
产品
解决方案
定价
更多

如何在discord.js消息嵌入中显示本地图片?附件返回undefined排查

问题描述

我正在开发支持角色抽取功能的半抽卡Discord机器人,需要在用户完成抽卡操作后展示对应角色的图片,但目前遇到图片完全无法显示的问题。我查找过看似有效的同类解决方案但问题仍未解决,运行时没有任何报错,无法定位问题。
我首先尝试打印MessageAttachment的返回结果,测试代码如下:

const attachment = new Discord.MessageAttachment('./chars/1.Jakku.png', '1.Jakku.png');
console.log(attachment);

运行后打印结果为undefined,我已确认正确导入了discord.js库,以下是与问题相关的核心代码片段:

collector.on('collect', reaction => {
    // 新建embed
    const newEmbd = new Discord.MessageEmbed();

    // 抽卡逻辑
    if (reaction.emoji.name === '✅') {  
        const values = Object.values(chars);
        const randomChar = values[parseInt(Math.floor(Math.random()*values.length))];

        const attachment = new Discord.MessageAttachment('./chars/1.Jakku.png', '1.Jakku.png');
        const charData = randomChar.split('.');

        newEmbd
            .setTitle(`你抽取到了:${charData[1]}!`)
            .setColor('YELLOW')
            .attachFiles(attachment)
            .setImage(`attachment://1.Jakku.png`);
        embdReact.edit(newEmbd);
        pulled = true;
    } else if (reaction.emoji.name === '❌') {
        newEmbd
            .setTitle('抽卡时间到!')
            .setColor('YELLOW')
            .addFields(
                { name: '结果:', value: '你选择了放弃抽卡' }
            );
        embdReact.edit(newEmbd);
    };
});
问题原因与解决步骤

本次问题的两个核心根源:

  • MessageAttachment构造后返回undefined:当前所用discord.js版本中该构造函数不存在,或导出链路异常
  • 附件传入方式不兼容当前版本:discord.js v13及以上版本已彻底移除MessageEmbed类的attachFiles方法,附件不能绑定在embed对象上,需直接传入消息的编辑/发送参数

按以下步骤修改即可解决:

  1. 先确认当前项目的discord.js版本,在项目根目录执行npm list discord.js查看版本号
    • 若为v13及以上版本,直接按后续步骤修改代码即可
    • 若为v12及以下版本,先检查discord.js包安装是否完整,避免导入路径错误导致构造函数未定义
  2. 调整抽卡分支的代码逻辑,移除embed上的attachFiles调用,改为在编辑消息时通过files参数传入附件:
    // 替换原有抽卡分支中的对应代码
    const attachment = new Discord.MessageAttachment('./chars/1.Jakku.png', '1.Jakku.png');
    const charData = randomChar.split('.');
    
    newEmbd
        .setTitle(`你抽取到了:${charData[1]}!`)
        .setColor('YELLOW')
        .setImage(`attachment://1.Jakku.png`);
    // 编辑消息时同时传入embed数组和文件数组
    embdReact.edit({ embeds: [newEmbd], files: [attachment] });
    
  3. 校验图片路径有效性:./chars/1.Jakku.png的路径是相对于node进程启动的工作目录,而非代码文件所在目录,可在构造附件前先确认文件是否存在,避免路径错误导致附件加载失败

内容的提问来源于stack exchange,提问作者Wowy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 23:15:08