You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord斜杠命令能否以模块形式复用?Node.js与Discord.js新手技术咨询

斜杠命令Embed模块化的正确实现方式

嘿,作为Discord.js新手能想到模块化复用代码,这个思路真的很棒!你的方向是对的,但有几个细节需要调整,我来帮你理清楚:

1. 先纠正你的类型参数与Embed结构错误

你代码里的type: 4其实是对的——这个类型对应Discord API的CHANNEL_MESSAGE_WITH_SOURCE,表示直接返回一条消息给触发命令的用户。但Embed的传递方式错了:

  • 不能把MessageEmbed实例直接赋值给content,Discord API要求Embed放在embeds数组里,并且需要转换成JSON格式(因为API只认JSON数据)。

2. 优化你的rules.js模块化文件

我们可以把Embed的创建和回调数据封装在单独的文件里,方便复用:

// commands/rules.js
const { MessageEmbed } = require('discord.js');

// 1. 先定义你的规则Embed
const rulesEmbed = new MessageEmbed()
  .setColor('#2ecc71')
  .setTitle('📜 服务器规则')
  .setDescription('请遵守以下规则,共同维护友好社区')
  .addFields(
    { name: '✅ 友好交流', value: '禁止人身攻击、歧视性言论' },
    { name: '🚫 禁止广告', value: '未经允许不得发布任何广告内容' },
    { name: '📵 敏感内容', value: '禁止传播色情、暴力等违规内容' }
  )
  .setFooter('服务器管理团队')
  .setTimestamp();

// 2. 导出斜杠命令需要的回调数据
module.exports = {
  // 用函数返回数据,后续如果需要动态修改Embed会更灵活
  getCallbackData: () => ({
    type: 4, // 正确的回调类型
    data: {
      embeds: [rulesEmbed.toJSON()] // 必须转成JSON,放到embeds数组中
    }
  })
};

3. 在main.js中正确调用模块化的命令

接下来在主文件里引入并使用这个模块,注意路径要正确(如果rules.js在commands文件夹下,路径是./commands/rules.js):

// main.js
const { Client } = require('discord.js');
const client = new Client({ intents: [] }); // 根据你的Discord.js版本设置必要的intents
const rulesCommand = require('./commands/rules.js');

client.ws.on('INTERACTION_CREATE', async (interaction) => {
  const commandName = interaction.data.name.toLowerCase();

  if (commandName === 'rules') {
    try {
      // 获取预定义的回调数据,发送给Discord API
      await client.api.interactions(interaction.id, interaction.token).callback.post({
        data: rulesCommand.getCallbackData()
      });
    } catch (error) {
      console.error('发送规则命令出错:', error);
    }
  }
});

// 登录机器人
client.login('你的机器人令牌');

额外建议:用Discord.js新版本的封装功能(v13+)

如果你使用的是Discord.js v13或更高版本,官方提供了更简洁的斜杠命令处理方式,不需要直接操作client.ws,可以进一步简化模块化:

// commands/rules.js(新版本写法)
const { SlashCommandBuilder, MessageEmbed } = require('discord.js');

module.exports = {
  // 定义斜杠命令的元数据(用于注册命令)
  data: new SlashCommandBuilder()
    .setName('rules')
    .setDescription('查看服务器规则'),
  
  // 命令执行逻辑
  async execute(interaction) {
    const rulesEmbed = new MessageEmbed()
      // ...和之前一样的Embed配置
    ;
    // 直接回复交互,自动处理API细节
    await interaction.reply({ embeds: [rulesEmbed] });
  }
};

然后在主文件里用命令加载器(比如结合@discordjs/builders和discord.js的Collection)来管理所有命令,代码会更易维护。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 22:57:49