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

如何在Discord.js Commando的不同命令文件中调用bot变量?

解决Commando框架中在命令文件访问bot实例的问题

在Discord.js的Commando框架里,有几种简单的方式能让你在命令文件中访问到index.js里创建的bot实例,用来做权限检查或者其他操作,下面给你详细说两种最常用的方法:

方法一:利用Command类内置的this.client(推荐)

Commando的Command类在初始化时,已经把你创建的bot实例传递给了命令对象,所以在命令的run方法或者其他类方法里,直接用this.client就能拿到bot实例,这是最符合框架设计的方式,完全不需要额外导出操作。

举个实际的权限检查例子:

const { Command } = require('discord.js-commando');

module.exports = class CheckPermCommand extends Command {
  constructor(client) {
    super(client, {
      name: 'checkbotperm',
      group: 'admin',
      memberName: 'checkbotperm',
      description: '检查机器人在当前服务器的权限',
    });
  }

  async run(message) {
    // 获取机器人在当前服务器的成员对象
    const botMember = message.guild.me;
    // 检查是否有发送消息和管理频道的权限
    const hasRequiredPerms = botMember.permissions.has(['SEND_MESSAGES', 'MANAGE_CHANNELS']);

    if (hasRequiredPerms) {
      return message.reply('我拥有所需的所有权限哦!');
    } else {
      // 列出缺少的权限
      const missingPerms = botMember.permissions.missing(['SEND_MESSAGES', 'MANAGE_CHANNELS']);
      return message.reply(`我缺少以下权限:${missingPerms.join(', ')}`);
    }
  }
};

这里的this.client和你在index.js里创建的bot变量是同一个实例,所以你可以用它调用任何client的方法,比如this.client.guilds、this.client.user等等。

方法二:导出bot实例并在命令文件中引入

如果你需要在命令类之外的代码里访问bot实例(比如命令初始化时的一些前置逻辑),可以把index.js里的bot实例导出,然后在命令文件中require进来。

步骤1:在index.js中导出bot

const commando = require('discord.js-commando');
const config = require('./config.json');

// 创建bot实例
const bot = new commando.Client({ 
  commandPrefix: '!', 
  owner: config.ownerID, 
  unknownCommandResponse: false 
});

// 导出bot实例,让其他文件可以引用
module.exports = bot;

// 后续的初始化代码(注册命令、登录等)
bot.registry
  .registerDefaultTypes()
  .registerGroups([['admin', '管理员命令']])
  .registerDefaultGroups()
  .registerDefaultCommands();

bot.login(config.token);

步骤2:在命令文件中引入bot

const { Command } = require('discord.js-commando');
// 根据你的文件结构调整路径,比如index.js在根目录,命令文件在commands/admin下的话就是../..
const bot = require('../../index.js');

module.exports = class ExampleCommand extends Command {
  constructor(client) {
    super(client, {
      name: 'example',
      group: 'admin',
      memberName: 'example',
      description: '通过导出的bot实例检查权限',
    });
  }

  async run(message) {
    // 直接使用bot变量,和this.client是同一个对象
    const canManageRoles = bot.guilds.cache.get(message.guild.id).me.permissions.has('MANAGE_ROLES');
    message.reply(`我是否能管理角色?${canManageRoles ? '✅ 是' : '❌ 否'}`);
  }
};

注意事项

  • 推荐优先使用方法一,因为它避免了模块引用可能带来的循环依赖问题,也更符合Commando的设计规范。
  • 如果使用方法二,要确保index.js里的bot实例已经被创建后再导出,不要在初始化代码前导出,否则会拿到undefined。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:14:10