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

Discord bot运行时报TypeError: Cannot read property 'get' of undefined求解

问题根因
  • message.js中新建了独立的Discord.Client实例,没有挂载commands集合,和主文件中加载了所有命令的客户端不是同一个对象,因此访问client.commands返回undefined,调用get方法自然报错。
  • 主文件未导入fs模块,读取目录文件时会直接抛出未定义错误。
  • 主文件重复注册了message事件处理逻辑,和加载的message.js事件处理冲突,属于冗余代码。
修复步骤

1. 修复主文件(main.js)

首先在文件顶部补充fs模块导入,删除重复的config引入:

const fs = require('fs');
const Discord = require('discord.js');
const {prefix, token} = require('./config.json');

const client = new Discord.Client();
client.commands = new Discord.Collection();

然后删除主文件中手动编写的整块client.on('message', message => { ... })逻辑,你已经通过事件加载机制处理message事件,不需要重复注册。
修改事件绑定逻辑,将当前客户端实例作为参数传入事件的execute方法:

const eventFiles = fs.readdirSync('./events').filter(file => file.endsWith('.js'));
for (const file of eventFiles) {
    const event = require(`./events/${file}`);
    if (event.once) {
        client.once(event.name, (...args) => event.execute(...args, client));
    } else {
        client.on(event.name, (...args) => event.execute(...args, client));
    }
};

2. 修复message.js

删除第一行新建客户端的代码,修改execute方法接收主文件传入的client实例:

const prefix = 'p!';

module.exports = {
    name: 'message',
    execute(message, client) { 
        console.log(`${message.author.tag} in #${message.channel.name} sent: ${message.content}`);

        if(!message.content.startsWith(prefix) || message.author.bot) return;

        const args = message.content.slice(prefix.length).split(/ +/);
        const command = args.shift().toLowerCase();

        if (command === 'ping'){
            client.commands.get('ping').execute(message, args);
        } else if (command === 'help'){
            client.commands.get('trick').execute(message, args);
        } 
    }
};
验证

修改完成后重启bot,发送p!ping即可正常返回pong。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 20:06:04