Discord.js v12斜杠命令处理函数适配发送文件及Embed附件方案问询
Discord.js v12 斜杠命令响应文件发送适配方案
核心问题原因
当前msg函数返回的结构不符合Discord交互回调的格式要求:交互响应的files参数必须放在POST请求的顶层,仅放在内部data字段中的files不会被接口识别,因此会出现独立文件、Embed附件无法正常发送的问题。
适配方案
方案1:保留msg作为数据构造器,调用侧组装请求
该方案保留msg的轻量属性,方便在自定义处理器中灵活使用返回的数据:
async function msg(i, c) { const m = await Discord.APIMessage.create(client.channels.resolve(i.channel_id), c) .resolveData() .resolveFiles(); // 拆分返回数据和文件,适配后续组装要求 return { data: m.data, files: m.files } } // 调用示例 const { data, files } = await msg(interaction, { embeds: [new Discord.MessageEmbed().setTitle('测试附件').setImage('attachment://demo.png')], files: ['./local/demo.png'] // 支持本地文件路径或Buffer对象 }) // 按v12交互接口要求发起请求 client.api.interactions(interaction.id, interaction.token).callback.post({ data: { type: 4, data: data }, files: files })
方案2:直接封装发送逻辑到msg函数
如果需要复用之前已验证的send函数逻辑,直接把请求发送封装到msg内部即可:
async function msg(i, c) { const { data, files } = await Discord.APIMessage.create(client.channels.resolve(i.channel_id), c) .resolveData() .resolveFiles(); return client.api.interactions(i.id, i.token).callback.post({ data: { type: 4, data: data }, files }); }
注意事项
- Embed引用附件时,
setImage/setThumbnail的地址需要写成attachment://文件名的格式,和传入的文件名完全匹配 - 如果需要发送仅触发用户可见的临时消息,在传入
msg的content参数中添加ephemeral: true即可,文件功能不受影响
内容的提问来源于stack exchange,提问作者Noah
相关产品推荐
相关产品推荐

