You need to enable JavaScript to run this app. Discord.js v12斜杠命令处理函数适配发送文件及Embed附件方案问询
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 09:24:06